顾乔芝士网

持续更新的前后端开发技术栈

servlet和dom4j实现模拟struts1框架(二)

今天接着昨天的内容:

目标:使用反射知识取到配置在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);

纯手打代码,格式不好看。请谅解。

未完待续,请继续关注!

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言