反射是指可以在运行中获取类信息的能力。在java中,利用反射可以运行时获取类的结构信息,查看类实例的域值,动态调用类的方法,动态生成类实例。
这里对常用的反射的几个类进行练习。首先是Class这个类,根据这个类,可以获取成员,包括方法、变量、构造函数。如getFields()可以获取共有变量。而getDeclaredFields()可以获取所有声明的成员变量。Field表示类中的某个域,通过get方法可以获取某个实例的该域值。Method表示方法,通过invoke方法可以调用该方法。
以下代码是一个可以分析自身成员的类。在showClass()中会打印出各个成员的名称。对于变量,还会打印值。对于方法,如果是无参的,则会进行调用执行。
import java.lang.reflect.*;
public class ReflectTest{
private int intField;
private String strField;
public static final int finalFiled=3;
public ReflectTest(){
System.out.println("default constructor!");
}
private ReflectTest(int n){
System.out.println("another constructor:"+n);
}
public void run(){
System.out.println("run...");
}
public void showClass(Class<?>clazz){
System.out.println("class name:"+clazz.getName());
try{
Object obj=clazz.newInstance();
Field[]fields=clazz.getFields();
System.out.println("getFields()=>");
for(Field f:fields){
System.out.println(f+"="+f.get(obj));
}
System.out.println("getDeclaredFields()=>");
fields=clazz.getDeclaredFields();
for(Field f:fields){
System.out.println(f+"="+f.get(obj));
}
System.out.println("getDeclaredConstructors()=>");
Constructor<?>[]cons=clazz.getDeclaredConstructors();
for(Constructor<?>c:cons){
System.out.println(c);
}
Method[]me=clazz.getDeclaredMethods();
System.out.println("getDeclaredMethods()=>");
for(Method m:me){
System.out.println(m);
Class<?>[]parameter=m.getParameterTypes();
if(parameter==null||parameter.length==0)
m.invoke(obj);
}
}catch(Exception e){
System.out.println(e.getMessage());
}
}
public static void main(String[]args){
new ReflectTest().showClass(ReflectTest.class);
}
}
以下是执行的结果。
default constructor!
class name:ReflectTest
default constructor!
getFields()=>
public static final int ReflectTest.finalFiled=3
getDeclaredFields()=>
private int ReflectTest.intField=0
private java.lang.String ReflectTest.strField=null
public static final int ReflectTest.finalFiled=3
getDeclaredConstructors()=>
private ReflectTest(int)
public ReflectTest()
getDeclaredMethods()=>
public void ReflectTest.showClass(java.lang.Class)
public static void ReflectTest.main(java.lang.String[])
public void ReflectTest.run()
run...