栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

setAccessible方法忽略安全检查

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/715995.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号