Java Reflection
Java 反射(Reflection)是一种在运行时无需知道类名和方法名,就能检查类,接口,变量以及方法的机制。在编译时,反射机制可以实例化对象,调用方法,以及 Get/Set属性变量。
+ 反射用例
Method[] methods = MyObject.class.getMethods();
for (Method method : methods) {
System.out.println("method name = " + method.getName());
}
这个例子从MyObject
类获取了类对象,使用这个类对象获取了MyObject
类所有的方法数组,并遍历这些方法的名称。
类 Classes
使用Java 反射的第一步通常是在运行时检索Java类,通常对于Java类可以获取的信息包括:
- 类名 Class Name
- 类修饰符 Class Modifiers(public, private, synchronized etc.)
- 包信息 Package Info
- 超类 Superclass
- 实现的接口 Implemented Interfaces
- 构造方法 Constructors
- 方法 Methods
- 属性变量(域) Fields
- 注解 Annotations
类对象 Class Object
在检查类之前,通常需要获取去它的java.lang.Class
对象,Java中所有的类包含这个基础类型。
在编译时如果知道一个类的名称,我们可以通过如下方式获取类对象:
Class myObjectClass = MyObject.class;
编译时如果不知道类的名称,但是在运行时知道类名的字符串(class name as a string),可以通过如下方式获取类对象:
String className = ...;// 运行时获取的类名字符串
Class class = Class.forName(className);
Class.forName()
方法在 classpath 未发现类时抛出ClassNotFoundException
异常。
类名 Class Name
通过类对象获取类名有两种方式:
Class class = ...; // 类对象
String className = class.getName(); // 类完整的名称
String simpleClassName = class.getSimpleName(); // 类的简单名称 e.g. psfs TAG = MainActivity.class.getSimpleName();
修饰符 Modifiers
通过类对象获取类修饰符:
Class class = ...;
int modifiers = class.getModifiers();
修饰符被包装成 int 类型,每个修饰符是一个标识位(flag bit),每个被设置或清除。可以通过java.lang.reflect.Modifier
类检索这些修饰符:
Modifier.isAbstract(int modifiers)
Modifier.isFinal(int modifiers)
Modifier.isInterface(int modifiers)
Modifier.isNative(int modifiers)
Modifier.isPrivate(int modifiers)
Modifier.isProtected(int modifiers)
Modifier.isPublic(int modifiers)
Modifier.isStatic(int modifiers)
Modifier.isStrict(int modifiers)
Modifier.isSynchronized(int modifiers)
Modifier.isTransient(int modifiers)
Modifier.isVolatile(int modifiers)
包信息 Package Info
通过类对象获取包信息:
Class class = ...;
Package package = class.getPackage();
包对象还有很多信息,如包的version number,参见:Package
超类 Superclass
通过类对象获取超类:
Class superclass = class.getSuperclass();
实现的接口 Implemented Interfaces
通用类对象获取类所实现的接口:
Class class = // 类对象
Class[] interfaces = class.getInterfaces();
类可以实现多个接口,Java反射使用Class表示接口的类型。注意返回的接口数组仅包含当前类所实现的接口,不包含当前类的超类所实现的接口。
构造方法 Constructors
通过类对象获取类的构造方法:
Constructor[] constructors = class.getConstructors();
方法 Methods
通过类对象获取类的方法:
Method[] method = class.getMethods();
属性变量(域) Fields
通过类对象获取域的方法:
Field[] fields = class.getFields();
注解 Annotations
通过类对象获取注解的方法:
Annotations[] annotations = class.getAnnotations();