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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值