在运行时,使用反射分析类的能力。
下面简要地介绍一下反射机制最重要的内容:检查类的结构。在 java.lang.reflect 包中有三个类 Field、Method 和 Constructor 分别用于描述类的数据域、类的方法和类的构造器。
这三个类都有一个叫做 getName() 的方法,用来返回项目的名称。
Field 类有一个 getType() 方法,用来返回描述数据域所属类型的 Class 对象。
Method 类和 Constructor 类有能够报告参数类型的方法,Method 类还有一个可以报告返回类型的方法。
这三个类还有一个叫做 getModifiers() 的方法,它将返回一个整型数值,用不同的位开关描述 public 和 static 这样的修饰符使用状况。另外, 还可以利用 java.lang.reflect 包中的 Modifier 类的静态方法分析 getModifiers() 返回的整型数值。例如,可以使用 Modifier 类中的 isPublic()、isPrivate() 或 isFinal() 判断方法或构造器是否是 public、private 或 final 的。我们需要做的全部工作就是调用 Modifier 类的相应方法,并对返回的整型数值进行分析,另外,还可以利用 Modifier.toString() 方法将修饰符打印出来。
Class 类的 getFields()、getMethods() 和 getConstructors() 方法将分别返回类中声明的 public 域、public 方法和 public 构造器数组,其中包括父类的公有成员。
Class 类的 getDeclareFields()、getDeclareMethods() 和 getDeclaredConstructors() 方法将分别返回类中声明的全部的数据域、全部的方法和全部的构造器,其中包括私有和受保护成员,但不包括父类的成员。
分析对象
在运行时,使用反射分析对象。
从前面一节中,已经知道如何查看任意对象的数据域的名称和类型:
获得对应的 Class 对象。
调用 Class 对象的 getDeclaredFields() 方法。
本节将进一步查看数据域的实际内容。当然,在编写程序时,如果知道想要査看的数据域的名称和类型,查看指定的数据域是一件很容易的事情。而利用反射机制可以查看在编译时还不清楚的数据域。
查看数据域值的关键方法是 Field 类中的 get() 方法。如果 f 是一个 Field 类型的对象(例如,通过 getDeclaredFields() 得到的对象),obj 是某个包含 f 域的类的对象,f.get(obj) 将返回一个对象,其值为 obj 对象的 f 域的当前值。
当然,可以获得就可以设置。调用 f.set(obj, value) 可以将 obj 对象的 f 域设置成新值。
public static void main(String[] args) {
Employee harry = new Employee("Harry Hacker", 35000, 10, 1, 1989);
Class cl = harry.getClass();
// the class object representing Employee
Field f = cl.getDeclaredField("name");
// the name field of the Employee class
Object v = f.get(harry);
// the value of the name field of the harry object, i .e., the String object "Harry Hacker"