一、什么是反射机制?
反射Reflect:通过Java反射机制,我们可以在程序中访问已经装在到JVM中的对象的属性、方法,实现访问、检测、修改的功能。关于反射的一些方式存在于Java.lang.reflect包下。
二、反射机制都能反射到哪些东西?
包路径、类名称、继承类、实现接口、构造方法、方法、成员变量、内部类、内部类的声明类
在通过getFilelds()和getMethods()方法依次获得权限为public的成员变量和方法时,其中包含从超类继承到的成员变量和方法。而通过getDeclaredFields()和getDeclaredMethods()方法获得所有权限的成员变量和方法时只能获得本类中的。
三、访问构造方法后的一些操作
对于构造方法的操作用两种情况:
(1):权限为可获得的情况下,使用构造方法实例化对象可以使用newInstance()方法。
(2) : 权限为private的情况下,首先需要使用方法setAccessible(boolean flag),将其中的参数设置成true。之后再使用newInstance()方法。
注意:newInstance(Object o)在有参数的情况下会按照给定的参数实例化对象,在没有参数的情况下将会使用默认的无参构造。
四、访问成员变量
方法:getFields()、getField(String name)、getDeclaredFields()、getDeclaredField
如果指定成员变量,那么可以通过名称来访问,例如:object.getDeclaredField("String src");
五、访问方法
方法:getMethod()、getMethod(String name,Class<?>···parameterTypes)、getDeclaredMethods()、getDeclaredMethod(String name,Class<?>···parameterTypes)
如果是访问指定的方法,需要根据方法名称、入口参数来访问,例如:object.getDeclaredMethod("MethodName",String.class,int.class );
或者:object.getDeclaredMethod("MethodName",new class[]{String.class,int.class } );
在这里重点标记一个方法,有点熟悉但是不知道在哪里见过:
invoke(Object obj,Object···args):利用指定参数args操作指定对象中的该方法,返回值类型是object
总结:通过反射机制我们可以获得对象一些属性,并且可以对这些属性进行操作,强大之处是它可以在程序运行过程中反射,我认为这是反射机制强大最主要的原因。目前接触到的反射有ClassForName.这个反射我各人看来有窥一斑而知全豹的感觉,也就是说给一个方法的某一个属性,例如方法名字,就可以获得整个类,继而可以使用它的所有方法。但是反射还有一个弊端就是效率低,因为反射需要获得方法的权限信息,为了优化,使用setAccessible方法屏蔽安全访问。
引用地址:http://www.cnblogs.com/tartis/p/9299135.html
通过反射机制我们可以在运行期间获取对象的类型信息,利用这一特性我们可以实现工厂模式和代理模式(未学习)等设计模式,同时也可以解决Java泛型擦除(未学习)等令人苦恼的问题。
spring 的 ioc/di(未学习) 也是反射....
javaBean和jsp(未学习)之间调用也是反射....
struts的 FormBean(未学习) 和页面之间...也是通过反射调用....
JDBC 的 classForName()也是反射.....
hibernate的 find(Class clazz) (未学习)也是反射....