首先介绍一下AccessibleObject类的继承体系结构
AccessibleObject类的基本作用:
- 将反射的对象标记为在使用时取消默认 Java 语言访问控制检查的能力。
- 在反射对象中设置accessible 标志允许具有足够特权
public void setAccessible(boolean flag)throwsSecurityException{…}
- 当输入参数flag为true的时候,指示反射对象被使用时取消Java语言访问权限的检查。
- 当输入参数flag为false的时候,指示反射对象应该实施Java语言访问权限的检查。
我们下面用Field类活动private的成员变量,并用setAccessible方法来关闭权限检查,然后修改private成员变量的值
public class SingletonTest {
private String name = "ls";
public static void main(String[] args) throws ClassNotFoundException,
NoSuchFieldException, SecurityException, InstantiationException, IllegalAccessException {
//获取Class对象
Class clazz = Class.forName("test.EJ3Singleton.SingletonTest");
// 用getDeclaredField方法获取指定的非公有字段
Field field = clazz.getDeclaredField("name");
// 设置JVM取消对反射的对象进行java访问权限检查的机制
field.setAccessible(true);
// 实例化Class对象对应的实例
Object obj = clazz.newInstance();
//Class对象和指定操作字段进行关联
Object obj1 = field.get(obj);
System.out.println(obj1.toString());
//赋新值
field.set(obj, "lsssssss");
obj1 = field.get(obj);
System.out.println(obj1.toString());
}
}
运行结果:
ls
lsssssss