反射
反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵java代码的程序。
能够分析类能力的程序称为反射(reflective)。反射可以用来:
· 在运行中分析类的能力
· 在运行中查看对象
· 实现通用的数组操作代码
· 利用Method对象,很想C++中的函数指针。
Class类
在程序运行期间,java运行时系统始终会为所有的对象维护一个被成为运行时的执行标识。这个信息跟踪着每一个对象所属的类。虚拟机利用运行时类型信息选择相应的方法执行。
通过专门的java类可以访问这些信息(这些信息被成为Class)。
Object类中的getClass()方法可以返回一个Class类型的实例。
Employ e;
......
Class cl = e.getClass();
常用的Class方法是getName。这个方法返回类的名字。
System.out.println(e.getClass().getName() + " " + e.getName())
还可以调用静态方法forName来获得类名对应的Class。
String className = "java.util.Date";
Class cl = Class.forName(className);
最后,如果T是任意的java类型,那么T.class将表示匹配的类对象。
对了,记得加try....catch捕获异常
利用反射分析类的能力(检查类的结构)
在java.lang.reflect包中有三个类Field、Method和Constructor分别用于描述类的域,方法和构造器。
这三个类都有一个getName方法,可以返回项目名称.
Field类有一个getType方法,返回描述类所属类型的Class对象.
三个类都有一个getModifiiers方法,返回一个整型数值,用不同位开关描述public,static等修饰符的使用状况.
还可以用java.lang.reflect包中的Modifier类中的isPublic,isPrivate,isFinal判断方法或构造器的修饰符.
Class类中的getField、getMethod和getConstructor分别返回类提供的public域,方法和构造器组.