Field、Constructor、Method

FieldConstructorMethodjava.lang.reflect 包为分析类和接口提供的 3 个最重要的类,在 Class 类中也分别提供了对应的方法,可参考下面的思维导图: 使用反射分析类 - 图1其中 getFields()getConstructors()getMethods() 三个方法返回所有 public 修饰的属性和方法(包括从父类继承的);而 getDeclaredFields()getDeclaredConstructors()getDeclaredMethods() 则仅返回本类定义的属性和方法,但不限于 public。

Field 类有 getType() 方法返回属性类型ConstructorMethod 类有 getParameterTypes() 方法返回方法参数类型Method 类还有一个 getReturnType() 方法用于获取方法的返回值类型

Modifier

Modifier 也是 java.lang.reflect 包定义的类,用来存储属性或方法的修饰符,如 public staticprivate final 等。

FieldConstructorMethod都有一个 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. }

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