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)的方式关闭安全检查就可以 达到提升反射速度的目的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)