反射是Java的一大特性,可以通过反射来获取某一个类的全部域、构造方法和成员方法。
原理介绍
- 在java.lang.reflect包中有三个类Field、Method、Constructor分别用于描述类的域、方法和构造器。
- 这三个类都有一个叫做getName的方法,用来返回项目的名称
- Field类有一个getType方法,用来返回描述域所属的Class对象
- Method和Constructor类有一个getParameterTypes方法,返回参数类型的Class对象数组
- 这三个类都有一个getModifiers方法,它返回一个整型数值,用不同的位开关描述public和static这样的修饰符使用情况,并用Modifiers类中toString方法将修饰符打印出来
- Class类中的getFields、getMethods、getConstructors方法将分别返回类提供的public域、方法和构造方法数组,其中包括父类的公有成员
- Class类的getDeclareFields、getDeclareMethods和getDeclaredConstructors方法将返回类中生命的全部域、方法和构造方法数组,其中包括私有成员和受保护成员,但不包括父类的成员
代码示例
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Scanner;
public class ReflectionTest {
public static void main(String[] args) {
String name;
if (args.length > 0) name = args[0];
else {
Scanner in = new Scanner(System.in);
System.out.print("Enter Class name (e.g java.util.Date):");
name = in.next();
}
try {
Class cl = Class.forName(name);
Class supercl = cl.getSuperclass();
String modifiers = Modifier.toString(cl.getModifiers());
if (modifiers.length() > 0 )System.out.print(modifiers + " ");
System.out.print("class "+name);
if (supercl != null && supercl != Object.class) {
System.out.print("extends "+supercl.getName());
}
System.out.print("\n{\n");
printFields(cl);
System.out.println();
printConstructors(cl);
System.out.println();
printMethods(cl);
System.out.print("}\n");
} catch (Exception e) {
// TODO: handle exception
}
}
public static void printConstructors(Class cl) {
Constructor[] constructors = cl.getConstructors();
for (Constructor c:constructors) {
System.out.print(" ");
String name = c.getName();
String modifiers = Modifier.toString(c.getModifiers());
if (modifiers.length() > 0 )System.out.print(modifiers + " ");
System.out.print(name+" (");
Class[] paramType = c.getParameterTypes();
for (int j = 0; j < paramType.length; j++) {
if (j > 0) System.out.print(", ");
System.out.print(paramType[j].getName());
}
System.out.print(")");
}
System.out.println();
}
public static void printMethods(Class cl) {
Method[] methods = cl.getDeclaredMethods();
for (Method m:methods) {
System.out.print(" ");
String name = m.getName();
String modifiers = Modifier.toString(m.getModifiers());
if(modifiers.length()>0) System.out.print(modifiers+" ");
Class returnType =m.getReturnType();
System.out.print(returnType.getName()+" ");
System.out.print(name+" (");
Class[] paramType = m.getParameterTypes();
for (int j = 0; j < paramType.length; j++) {
if (j > 0) System.out.print(", ");
System.out.print(paramType[j].getName());
}
System.out.print(")");
System.out.println();
}
System.out.println();
}
public static void printFields(Class cl) {
Field[] fields = cl.getDeclaredFields();
for (Field f:fields) {
System.out.print(" ");
String name = f.getName();
Class type = f.getType();
String modifiers = Modifier.toString(f.getModifiers());
if(modifiers.length()>0) System.out.print(modifiers+" ");
System.out.println(type.getName()+" "+name+";");
}
}
}