Java反射是Java被视为动态语言的一个关键性质,这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其modifiers(诸如public, static 等)、superclass(例如Object)、实现之interfaces(例如Cloneable),也包括fields和methods的所有信息,并可于运行时改变fields内容或唤起methods。
反射找到类信息的过程:
1)通过类的全限定名可以找到该类的Class类的对象:Class<?> refClass = Class.forName("somepackage.ReflectionTest”);
2)通过Class类的对象可以查到该类的方法、成员变量等信息,最底层调用的是native方法查询class文件中的内容;
3)如果Class类的对象的ReflectionData数据体为空,则从JVM中获取;
这里介绍一下Class类,我们知道所有Java类都继承自java.lang.Object类,Object类中引用了Class对象,调用Object的getClass()方法,可以取得该类被实例化的对象的类的引用,这个引用指向的是Class类的对象。该对象在该类被调用时,由JVM自动创建,Class对象无法人为主动创建。该对象有个字段记录了类加载器,如果该字段为null,则该类的类加载器为Bootstrap classloader。
通过Class对象的getClassLoader(),可以查到类加载器,通过类加载器就可以得到ReflectionData中类信息,ReflectionData具体内容如下:
// Class对象中的ReflectionData
static class ReflectionData<T> {
volatile Field[] declaredFields;
volatile Field[] publicFields;
volatile Method[] declaredMethods;
volatile Method[] publicMethods;
volatile Constructor<T>[] declaredConstructors;
volatile Constructor<T>[] publicConstructors;
volatile Field[] declaredPublicFields;
volatile Method[] declaredPublicMethods;
final int redefinedCount;
ReflectionData(int redefinedCount) {
this.redefinedCount = redefinedCount;
}
}