java通过反射获取的Field得到类实例的域信息
首先我们要了解访问java类的实例域(成员变量)有两种方式:
1、通过我们写的getter,setter方法访问类的成员变量,这两个方法可以我们自己写,也可以用编辑器自动生成。
2、通过反射的方式访问类的成员变量。这里我们来实现一下用反射访问实例域。
先看看代码实现
TestReflections.java:
package MM;
public class TestReflection {
private String name;
public TestReflection(String name) {
this.name=name;
}
}
TestReflection.java:
package MM;
import java.lang.reflect.Field;
public class TestReflections {
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
TestReflection a=new TestReflection("lyc");
Class cl=a.getClass();
Field field=cl.getDeclaredField("name");
field.setAccessible(true);
Object s=field.get(a);
System.out.println(s);
field.set(a, "ljm");
s=field.get(a);
System.out.println(s);
}
}
从上面代码我们可以通过反射获取到name的值,然后通过set改变name的值。
注意当类的域是私有的时候,不能通过这种方式访问,这时候需要一个权限。
可以通过setAccessible为true实现对私有域的访问。
我们可以通过反射生成一个类的对象实例。比如这样生成一个实例:
Test(类名) t=Class.forname("Test").newInstance();
然后通过代理实现对类方法的调用。
懂得了反射的原理,你就会明白一些框架的底层实现。