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 type
String name = f.getName(); // field name
String modifiers = Modifier.toString(f.getModifiers()); // field modifier
if (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 modifier
if (modifiers.length() > 0) {
System.out.print(modifiers + " ");
}
String name = c.getName(); // constructor name
System.out.print(name + "(");
// print parameter types
Class<?>[] 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 type
String name = m.getName(); // method name
System.out.print(returnType.getName() + " " + name + "(");
// print parameter types
Class<?>[] 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(");");
}
}
以上三个示例既可以分析类,也可以分析接口(枚举属于类,注解属于接口),但是接口无构造方法,所以返回为空。