Field、Constructor、Method
Field 、 Constructor 、 Method 是 java.lang.reflect 包为分析类和接口提供的 3 个最重要的类,在 Class 类中也分别提供了对应的方法,可参考下面的思维导图:
其中 getFields() 、 getConstructors() 、 getMethods() 三个方法返回所有 public 修饰的属性和方法(包括从父类继承的);而 getDeclaredFields() 、 getDeclaredConstructors() 、 getDeclaredMethods() 则仅返回本类定义的属性和方法,但不限于 public。
Field 类有 getType() 方法返回属性类型; Constructor 和 Method 类有 getParameterTypes() 方法返回方法参数类型; Method 类还有一个 getReturnType() 方法用于获取方法的返回值类型。
Modifier
Modifier 也是 java.lang.reflect 包定义的类,用来存储属性或方法的修饰符,如 public static、 private final 等。
Field 、 Constructor 、 Method 类都有一个 getModifiers() 方法,用于获取对应的修饰符,注意该方法的返回值是 int 类型( Modifier 使用类似位图机制来存储修饰符情况),可以将返回值传入 Modifier.toString() 静态方法解析。
分析 Field 示例
public static void printFields(Class<?> cl) {Field[] fields = cl.getDeclaredFields();for (Field f : fields) {Class<?> type = f.getType(); // field typeString name = f.getName(); // field nameString modifiers = Modifier.toString(f.getModifiers()); // field modifierif (modifiers.length() > 0) {System.out.print(modifiers + " ");}System.out.println(type.getName() + " " + name + ";");}}
分析 Constructor 示例
public static void printConstructors(Class<?> cl) {Constructor<?>[] constructors = cl.getDeclaredConstructors();for (Constructor <?> c : constructors) {String modifiers = Modifier.toString(c.getModifiers()); // constructor modifierif (modifiers.length() > 0) {System.out.print(modifiers + " ");}String name = c.getName(); // constructor nameSystem.out.print(name + "(");// print parameter typesClass<?>[] parameterTypes = c.getParameterTypes();for (int i = 0; i < parameterTypes.length; i++) {if (i > 0) {System.out.print(", ");}System.out.print(parameterTypes[i].getName());}System.out.println(");");}}
分析 Method 示例
public static void printMethods(Class<?> cl) {Method[] methods = cl.getDeclaredMethods();for (Method m : methods) {String modifiers = Modifier.toString(m.getModifiers());if (modifiers.length() > 0) {System.out.print(modifiers + " ");}Class<?> returnType = m.getReturnType(); // method return typeString name = m.getName(); // method nameSystem.out.print(returnType.getName() + " " + name + "(");// print parameter typesClass<?>[] parameterTypes = m.getParameterTypes();for (int i = 0; i < parameterTypes.length; i++) {if (i > 0) {System.out.print(", ");}System.out.print(parameterTypes[i].getName());}System.out.println(");");}}
以上三个示例既可以分析类,也可以分析接口(枚举属于类,注解属于接口),但是接口无构造方法,所以返回为空。
