一、反射机制(Reflection)概述
在java运行时环境中,动态获取类的信息以及动态调用对象的方法都是基于java的反射机制来完成的。
注意点:是在java的运行过程中,不是在编译过程中。讲到Reflection就要联想到运行时环境。
二、Reflection的功能
1.在运行时判断任意一个对象所属的类;
2.在运行时构造任意一个类的对象;
3.在运行时判断任意一个类所具有的成员变量;
4.在运行时调用任意一个对象的方法。
java的这个机制允许在运行时透过Reflection APIs取得任何一个已知名称(可以是自己定义的class、如Person类,或者已知的“java.lang.String”等已知类)的class的内部信息,包括此class的修饰符、父类、实现的接口、属性、方法(包括构造方法)等所有信息,也可以在运行时修改属性内容或调用方法。
java其实是一门静态语言,但Reflection是java被视为动态语言(准确来讲,为准动态)的一个关键性质。对于动态语言,允许在程序运行时改变程序结构或变量类型,例如可以访问private类型的属性和方法就是利用的这个原理。
举一个动态语言例子,为特定类型的属性赋值一个其他类型:
int a = 1;
a = "lpp";
a = true;
这个例子说明,程序在运行过程中改变了属性a的数据类型,这在动态语言中是可行的。虽然java是一门静态语言,但利用其反射机制,也能实现如上代码。
三、java中实现Reflection的类
在java.lang和java.lang.reflect包中,存在几个实现java反射机制的类:
1.Class类:代表一个类。每个类和接口都有一个与之关联的Class对象,无论生成某个类的多少个对象,这些对象都对应此类的同一个Class类;例如生产类Integer的多个对象,这些对象都对应于Integer所对应的Class对象。
java.lang
类 Class<T>
java.lang.Object java.lang.Class<T>
2.Field类:代表类的成员变量(属性)。
java.lang.reflect
类 Field
java.lang.Object java.lang.reflect.AccessibleObject java.lang.reflect.Field
3.Method类:代表类的方法。
java.lang.reflect
类 Method
java.lang.Object java.lang.reflect.AccessibleObject java.lang.reflect.Method
4.Constructor类:代表类的构造方法。
java.lang.reflect
类 Constructor<T>
java.lang.Object java.lang.reflect.AccessibleObject java.lang.reflect.Constructor<T>
5.Array类:提供了一个动态创建数组,以及访问数组元素的静态方法。专门用于在反射机制中对数组的操作。
java.lang.reflect
类 Array
java.lang.Object java.lang.reflect.Array
四、实现Reflection的类的使用
1.Reflection中Class类的使用方法
(1)使用反射机制时,首先应得到需要操作的对象所对应的Class类。利用Class类的forName方法得到所操作类的Class对象:
static Class<?> |
forName(String className) 返回与带有给定字符串名的类或接口相关联的 Class 对象。 |
(2)通过Class类的getMethods()方法得到一个包含某些Method对象的数组,这些Method对象就是Class对象所对应的类或接口的所有public方法(包括继承的父类中的方法、不包括构造方法)。
Method[] |
getMethods() < |