深入java反射

作者: 激情的狼王 | 来源:发表于2017-10-31 15:54 被阅读0次

    概念:反射(Reflection)是Java 程序开发语言的特征之一,反射也是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高!
    功能:

    1.确定一个对象的类
    2.取出类的modifiers,数据成员,方法,构造器,和超类.
    3.找出某个接口里定义的常量和方法说明.
    4.创建一个类实例,这个实例在运行时刻才有名字(运行时间才生成的对象).
    5.取得和设定对象数据成员的值,如果数据成员名是运行时刻确定的也能做到.
    6.在运行时刻调用动态对象的方法.
    7.创建数组,数组大小和类型在运行时刻才确定,也能更改数组成员的值.

    反射功能演示

    //第一种方式:
    Class c1 = Class.forName("Employee");
    //第二种方式:
    //java中每个类型都有class 属性.
    Class c2 = Employee.class;
    //第三种方式:
    //java语言中任何一个java对象都有getClass 方法
    Employeee = new Employee();
    Class c3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee)
    //创建此Class 对象所表示的类的一个新实例
    Objecto = c.newInstance(); //调用了Employee的无参数构造方法.
    //获取所有的属性
    Field[] fs = c.getDeclaredFields();
    //获取所有的方法
    Method[] ab = aa.getMethods();
    //获取方法的返回值类型
    ab[0].getReturnType()

    实际应用场景:
    1.反射最重要的用途就是开发各种通用框架。
    很多框架(比如Spring)都是配置化的(比如通过XML文件配置JavaBean,Action之类的),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。
     举一个例子,在运用Struts 2框架的开发中我们一般会在struts.xml里去配置Action,比如:

    <action name="login"
                   class="org.ScZyhSoft.test.action.SimpleLoginAction"
                   method="execute">
          <result>/shop/shop-index.jsp</result>
          <result name="error">login.jsp</result>
     </action>
    

    配置文件与Action建立了一种映射关系,当View层发出请求时,请求会被StrutsPrepareAndExecuteFilter拦截,然后StrutsPrepareAndExecuteFilter会去动态地创建Action实例。
    ——比如我们请求login.action,那么StrutsPrepareAndExecuteFilter就会去解析struts.xml文件,检索action中name为login的Action,并根据class属性创建SimpleLoginAction实例,并用invoke方法来调用execute方法,这个过程离不开反射。
    对与框架开发人员来说,反射虽小但作用非常大,它是各种容器实现的核心。而对于一般的开发者来说,不深入框架开发则用反射用的就会少一点,不过了解一下框架的底层机制有助于丰富自己的编程思想,也是很有益的。
    2.其它应用
    spring 的 ioc/di 也是反射....
    javaBean和jsp之间调用也是反射....
    struts的 FormBean 和页面之间...也是通过反射调用....
    JDBC 的 classForName()也是反射.....
    hibernate的 find(Class clazz) 也是反射....

    相关文章

      网友评论

        本文标题:深入java反射

        本文链接:https://www.haomeiwen.com/subject/mxebpxtx.html