今天接着昨天的内容:
目标:使用反射知识取到配置在xml文件中的类
回顾昨天的内容:
为了不配置多个servlet,而采用一个ActionServlet来处理很多个请求,但是
单一的Servlet中存在大量的if….else if的判断,不利于开发维护,也不满足“分”的思想
如何解决?
解决方案:
分:每一个请求使用单独的Action类来处理
活:不在ActionServlet的代码中使用if….else if产生 Action. 将对应关系书写在配置文件中,然后使用反射的方式产生,并且调用。
如何得到配置文件中的类.
<action path="/login"
type="com.login.LoginAction"
name="LoginForm"
scope="request">
<forward name="success" path="/index.jsp"></forward>
<forward name="error" path="/userError.jsp?i=1"></forward>
</action>
如上这个配置文件,如果页面输入的地址是login,那么如何找到LoginAction,并且执行相应的处理呢.
Java的反射技术是java程序的特征之一,它允许运行中的Java程序对自身进行检查,或者说“自审”,并能直接操作程序的内部属性。
使用反射可以获得Java类中各个成员的名称并显示出来。简单的说,反射就是让你可以通过名称来得到对象(类,属性,方法)的技术。
反射的原理:
对象创建过程:比如要创建Dog类的三个对象
Dog d1 = new Dog();
Dog d2 = new Dog();
Dog d3 = new Dog();
在这个过程中,JVM的底层实现过程如下:
1.JVM利用DogClassLoader先将Dog类加载到内存,然后马上产生了一个Class类型的对象,该对象可以看成是一个模型,以后无论创建多少个Dog类的实例都是利用该模型来生成。
所以一个类所对应的Class类型的对象只有一个。
2.根据这个模型生成Dog类的三个实例d1、d2、d3。
反射正是利用了java的这种加载方式主动完成了对象的创建及使用。
如何使用反射
遵循三个步骤
第一步是获得你想操作的类的 java.lang.Class 对象
怎么得到Class,使用Class c = Class.forName(strg);
第二步是调用诸如 getDeclaredMethods 得到类的方法 ,而得到属性用getDeclaredFields()
第三步使用 reflection API 来操作这些信息
主要使用newInstance()和invoke()方法
实例
没有new对象,实现了属性的赋值和取值.
Class cls = Class.forName("
com.yidu.reflection.Student") ;//得到class
Method m = cls.getMethod("setName",new Class[]{String.class}) ;//得到class中的setName方法,并指定了参数类型
Object obj = cls.newInstance() ;//实例出一个对象
m.invoke(obj, new Object[]{"老王"}) ;//执行setName方法,将name属性赋值
Method m1 = cls.getMethod("getName",null) ;//得到getName的方法
Object name1 = m1.invoke(obj, null) ; //执行该方法,得到getName的值
System.out.println("name=====>"+name1);
纯手打代码,格式不好看。请谅解。
未完待续,请继续关注!