Java反射
反射指的是程序在运行时可以获取类的信息、创建对象、调用方法的一种机制。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的字段、方法,并访问这些信息。
Java中,所有类的元信息通过Class实例来表示,任何类都有一个Class类型的对象,表示这个类的信息,这些信息存储在jvm的方法区内。Class对象可以动态加载类,获取类的字段,方法,构造该类的对象,调用类的方法等。具体看看怎样使用吧。
声明一个类
public class Increment {
public String b;
private String a;
public void run(String s){
System.out.println(s);
}
private void r2(String s){
System.out.println(s);
}
}
通过反射使用这个类
public class Test {
public static void main(String[] ar) throws Exception {
Class obj = Increment.class;
System.out.println("父类:" + obj.getSuperclass());
Object instance=obj.getDeclaredConstructor().newInstance();//获取构造函数实例化对象
Field[] fields = obj.getDeclaredFields();//获取声明的字段
for (Field field : fields) {
System.out.println("字段名:"+field.getName());
field.setAccessible(true);//运行访问private字段
field.set(instance,"test");//将字段的值设为test
System.out.println(field.get(instance));//获取字段的值
}
System.out.println("==================");
Method[] methods = obj.getDeclaredMethods(); //获取声明的方法
for (Method method : methods) {
System.out.println("方法名:"+method.getName());
method.setAccessible(true);
method.invoke(instance,"testinvoke"); //调用方法
}
}
}
运行结果:
父类:class java.lang.Object
字段名:b
test
字段名:a
test
==================
方法名:run
testinvoke
方法名:r2
testinvoke
反射由于其非常灵活,使得类与对象的产生不必事先创建,而是通过程序在运行时创建,使得它在各类框架中非常有用。后续的spring,struts2等框架中正是通过反射机制得以实现高度灵活的定制。