setAccessible()方法:
setAccessible 是启用和禁用访问安全检查的开关。值为 true 则表示反射的对象在使用
时应该取消 Java 语言访问检查。值为 false 则指示反射的对象应该实施 Java 语言访查;默认值为 false。
当我们使用反射机制拿到类当中所包含的一些对象时,比如说构造方法对象,成员变量对象,普通方法对象,当我们要去操作这些对象时,拿成员变量为例,它的访问控制符可能是public,也有可能是private。但我们只能操作public所修饰的成员变量,因为peivate只能在它自己的那个类中使用,出了它的那个类是用不了的。
所以当我们去操作这个成员变量对象时,Java的反射机制会对这个成员变量的对象进行安全检查,去看它的访问控制符到底是什么,如果是public修饰,则允许你使用,如果是private修饰,则不允许你使用。
案例:
当我没使用setAccessible方法去忽略安全检查时去获取Users类中的一个private修饰的username成员变量时:
public class Test3 {
public static void main(String[] args) throws Exception{
Users users = new Users();
Class clazz = users.getClass();
Field field = clazz.getDeclaredField("username");
field.set(users,"Corey");
Object object = field.get(users);
System.out.println(object);
}
}
报错了:
当使用了 setAccessible方法忽略安全检查时,就不会报错了:
//setAccessible方法
public class Test3 {
public static void main(String[] args) throws Exception{
Users users = new Users();
Class clazz = users.getClass();
Field field = clazz.getDeclaredField("username");
//忽略安全检查
field.setAccessible(true);
field.set(users,"Corey");
Object object = field.get(users);
System.out.println(object);
}
}
同时,由于 JDK 的安全检查耗时较多.所以通过 setAccessible(true)的方式关闭安全检查就可以 达到提升反射速度的目的。