setAccessible方法忽略安全检查

setAccessible方法忽略安全检查,第1张

setAccessible方法忽略安全检查

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)的方式关闭安全检查就可以 达到提升反射速度的目的。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5712634.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存