现在的位置: 首页 > 综合 > 正文

反射机制的一个小实例

2018年04月21日 ⁄ 综合 ⁄ 共 1474字 ⁄ 字号 评论关闭

这两天看了别人写的一个框架的代码, 其中用到了反射机制来调用不同的方法, 自己也对这个不太熟悉, 所以就
学习了一下用法, 仿造了那个代码做了一个小实例, 主要是用到struts的知识

1. 首先是jsp页面. 页面由两个链接组成

   <body>
	<a href="testAction.do?method=method1">method1</a><br/>
	<a href="testAction.do?method=method2">method2</a><br/>
   </body>

    两个链接都用同一个Action来处理, 但是用method参数来区分不同的处理方法

2. 接着是Action类, 通过Action类的execute方法来调用不同的方法

public class TestAction extends Action {
	@Override
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		String param = mapping.getParameter();
		String methodName = request.getParameter(param);
		Method method = this.getClass().getMethod(methodName, new Class[]{});
		method.invoke(this, new Object[]{});
		return null;
	}
	public void method1(){
		System.out.println("========method1========");
	}
	public void method2(){
		System.out.println("========method2========");
	}
}


在配置Action的时候, 指定了一个method参数, url必须附带method参数来指定方法
这里利用了ActionMapping来获取参数名, ActionMapping的作用会在另外的文章中说明

3. 以下是配置Action

	<action-mappings>
		<action path="/testAction" parameter="method" type="com.action.TestAction">
			<forward name="success" path="/WebContent/welcome.jsp"></forward>
		</action>
	</action-mappings>

指定参数是method
接着运行页面, 点击链接分别会调用method1和method2方法

getMethod: 是通过所调用方法所在对象的类来获取要调用的方法的Method对象
在getMethod方法中, 第一个参数是方法的名字, 第二个参数是所调用方法的参数的类型数组,
由于在这里没有参数, 所以数组为空(或者null)
invoke方法中, 第一个参数是所调用的方法所对应的对象(当所调用的方法为静态方法的时候, 可以为null, 但是如果为null的时候
调用了为静态方法的时候, 会报错), 第二个参数是所盗用方法的参数数组
由于在这里没有参数, 所以数组为空(或者null)

注: 在程序中, 发现有个问题, 当点击链接的时候, 方法会被执行两次(eclipse内置浏览器执行一次, 火狐执行两次)
如果将链接换成form来提交, 那么只会执行一次, 原因不明, 待我研究完后再补充


抱歉!评论已关闭.