用来
动态获取类的信息以及动态调用对象的方法的功能,这套机制叫作:反射。
反射是如今很多流行框架的实现基础,其中包括:Struts,Spring,Hibernate 等。
Java 的
反射机制:
在运行时判断任意一个对象所属的类,
在运行时判断任意一个类所具有的成员变量和方法,
在运行时构造任意一个类的对象,
在运行时调用任意一个对象的方法。
那么通过反射所获取的信息从什么地方获取呢?
对于每个类,在加载时都有一个唯一的Class对象,
Class对象中包含了所有需要动态获取的,类的信息。
-- 前面已经提到,如何获取Class对象的
三种方式。
主要由java.lang.reflect包下的类实现反射机制:
Class类: 代表一个类
Field类: 代表类的成员变量(也称为属性)
Method类: 代表类的方法
Modifier类: 代表修饰符
Constructor类: 代表类的构造方法
Array类: 提供了动态创建数组,以及访问数组的元素的
静态方法。
在Class对象方法中,
所有getXXXX方法只能反射出公有(public)类型的成员,包括父类的成员。
所有getDeclaredXXX方法可以反射出类的所有成员,包括私有成员,但只限于类本身成员。
Class中常用的方法:
getConstructors() :获得类的所有的public类型的构造方法。
getDeclaredConstructors() :获得类所有的构造方法。
getFields() : 获得类的public类型属性。
getMethod() : 获取类的public类型方法。
它们有各种
重载方法,大家参考API。
调用方法的步骤:
1.设定调用方法的参数列表(Class[])
2.获得调用方法的对象(Method)
3.设置调用方法的参数的值(Object[])
4.普通方法: invoke(obj,values)
5.构造方法: newInstance(values)
调用属性的步骤:
1.根据属性名字获取属性对象(Field)
2.赋值: set(obj,value)
3.取值: get(obj)
如果需要强行访问类的私有成员,则需要设置:
setAccessible(true)
反射就是照镜子,照出类的内部结构。