概念:反射(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) 也是反射....
网友评论