反射
Class类
class本身是一种数据类型(Type),class/interface的数据类型是Class,JVM为每个加载的class创建唯一的Class实例。
Class实例包含该class的所有信息,通过Class实例获取class信息的方法称为反射(Reflection)
获取一个class的Class实例:
-
Class cls = String.class;
- Class cls = "str".getClass();
- Class cls = Class.forName("java.lang.String");
注意Class的==比较和instanceof的区别。
从Class实例获取class信息:
- getName()
- getSimpleName()
- getPackage()
从Class实例判断class类型
- isInterface()
- isEnum()
- isArray()
- isPrimitive()
创建class实例:
cls.newInstance()
JVM总是动态加载class,可以在运行期根据条件控制加载class。
访问字段
Field
通过Class实例获取字段field信息:
- getField(name):获取某个public的field(包括父类)
- getDeclaredField(name):获取当前类的某个field(不包括父类)
- getFields():获取所有public的field(包括父类)
- getDeclaredFields():获取当前类的所有field(不包括父类)
Field对象包含一个field的所有信息:
- getName()
- getType()
- getModifiers()
获取和设置field的值:
- get(Object obj)
- set(Object, Object)
通过反射访问Field需要通过SecurityManager设置的规则。
通过设置setAccessible(true)来访问非public字段。
调用方法
Method
通过Class实例获取方法Method信息:
- getMethod(name, Class...):获取某个public的method(包括父类)
- getDeclaredMethod(name, Class...):获取当前类的某个method(不包括父类)
- getMethods():获取所有public的method(包括父类)
- getDeclaredMethods():获取当前类的所有method(不包括父类)
Method对象包含一个method的所有信息:
- getName()
- getReturnType()
- getParameterTypes()
- getModifiers()
调用Method:
- Object invoke(Object obj, Object... args)
通过设置setAccessible(true)来访问非public方法。
反射调用Method也遵守多态的规则。
调用构造方法
Constructor
调用public无参数构造方法:
- Class.newInstance()
通过Class实例获取Constructor信息:
- getConstructor(Class...):获取某个public的Constructor
- getDeclaredConstructor(Class...):获取某个Constructor
- getConstructors():获取所有public的Constructor
- getDeclaredConstructors():获取所有Constructor
通过Constructor实例可以创建一个实例对象:
- newInstance(Object… parameters)
通过设置setAccessible(true)来访问非public构造方法。
获取继承关系
继承关系
获取父类的Class:
- Class getSuperclass()
- Object的父类是null
- interface的父类是null
获取当前类直接实现的interface:
- Class[] getInterfaces()
- 不包括间接实现的interface
- 没有interface的class返回空数组
- interface返回继承的interface
判断一个向上转型是否成立:
- bool isAssignableFrom(Class)