Unsafe的使用

本文详细分析了在Java中尝试直接获取Unsafe实例时遇到的SecurityException异常,指出该异常源于getUnsafe方法的设计,仅允许从启动类加载器加载。为解决此问题,文章提供了一种通过反射调用 Unsafe 的方法,设置访问权限以规避异常。通过这种方法,开发者可以安全地使用Unsafe类的特性。

1、调用问题

我们直接获取Unsafe,调用其中属性方法时会出现异常:

java.lang.SecurityException: Unsafe
	at sun.misc.Unsafe.getUnsafe(Unsafe.java:90)
	at UnsafeTest.main(UnsafeTest.java:5)

在这里插入图片描述
异常分析:

Unsafe unsafe = Unsafe.getUnsafe();

上面这行代码出现的异常,获取Unsafe时出现异常,查看getUnsafe()方法如下:

	@CallerSensitive
    public static Unsafe getUnsafe() {
        Class var0 = Reflection.getCallerClass();
        if (!VM.isSystemDomainLoader(var0.getClassLoader())) {
            throw new SecurityException("Unsafe");
        } else {
            return theUnsafe;
        }
    }

如上getUnsafe()被设计成只能从启动类加载器(Bootstrap Class Loader)加载,所以我们自己直接调用时会出现异常。

2、如何调用

	//引用Unsafe需使用如下反射方式,否则会抛出异常java.lang.SecurityException: Unsafe
    public static Unsafe reflectGetUnsafe() throws NoSuchFieldException, IllegalAccessException {
        Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
        theUnsafe.setAccessible(true);//禁止访问权限检查(访问私有属性时需要加上)
        return (Unsafe) theUnsafe.get(null);
    }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值