Field、Constructor、Method

Field 、 Constructor 、 Method 是 java.lang.reflect 包为分析类和接口提供的 3 个最重要的类,在 Class 类中也分别提供了对应的方法,可参考下面的思维导图: 使用反射分析类 - 图1其中 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 示例

  1. public static void printFields(Class<?> cl) {
  2. Field[] fields = cl.getDeclaredFields();
  3. for (Field f : fields) {
  4. Class<?> type = f.getType(); // field type
  5. String name = f.getName(); // field name
  6. String modifiers = Modifier.toString(f.getModifiers()); // field modifier
  7. if (modifiers.length() > 0) {
  8. System.out.print(modifiers + " ");
  9. }
  10. System.out.println(type.getName() + " " + name + ";");
  11. }
  12. }

分析 Constructor 示例

  1. public static void printConstructors(Class<?> cl) {
  2. Constructor<?>[] constructors = cl.getDeclaredConstructors();
  3. for (Constructor <?> c : constructors) {
  4. String modifiers = Modifier.toString(c.getModifiers()); // constructor modifier
  5. if (modifiers.length() > 0) {
  6. System.out.print(modifiers + " ");
  7. }
  8. String name = c.getName(); // constructor name
  9. System.out.print(name + "(");
  10. // print parameter types
  11. Class<?>[] parameterTypes = c.getParameterTypes();
  12. for (int i = 0; i < parameterTypes.length; i++) {
  13. if (i > 0) {
  14. System.out.print(", ");
  15. }
  16. System.out.print(parameterTypes[i].getName());
  17. }
  18. System.out.println(");");
  19. }
  20. }

分析 Method 示例

  1. public static void printMethods(Class<?> cl) {
  2. Method[] methods = cl.getDeclaredMethods();
  3. for (Method m : methods) {
  4. String modifiers = Modifier.toString(m.getModifiers());
  5. if (modifiers.length() > 0) {
  6. System.out.print(modifiers + " ");
  7. }
  8. Class<?> returnType = m.getReturnType(); // method return type
  9. String name = m.getName(); // method name
  10. System.out.print(returnType.getName() + " " + name + "(");
  11. // print parameter types
  12. Class<?>[] parameterTypes = m.getParameterTypes();
  13. for (int i = 0; i < parameterTypes.length; i++) {
  14. if (i > 0) {
  15. System.out.print(", ");
  16. }
  17. System.out.print(parameterTypes[i].getName());
  18. }
  19. System.out.println(");");
  20. }
  21. }

以上三个示例既可以分析类,也可以分析接口(枚举属于类,注解属于接口),但是接口无构造方法,所以返回为空。