如何获取 sun.misc.Unsafe 的实例?

2022-09-02 22:32:28

如何获取不安全类的实例?

我总是收到安全异常。我列出了OpenJDK 6实现的代码。我想搞砸提供给我的功能,但我总是最终得到.sun.misc.UnsafeSecurityException("Unsafe")

public static Unsafe getUnsafe() {
    Class cc = sun.reflect.Reflection.getCallerClass(2);
    if (cc.getClassLoader() != null)
        throw new SecurityException("Unsafe");
    return theUnsafe;
}

(请不要试图告诉我使用这个类有多不安全。


答案 1

baeldung.com,我们可以使用反射来获取实例:

   Field f =Unsafe.class.getDeclaredField("theUnsafe");
   f.setAccessible(true);
   unsafe = (Unsafe) f.get(null);

编辑

以下内容引用自此代码所属项目的描述。

“所有这些示例和代码片段的实现都可以在GitHub上找到 - 这是一个Maven项目,所以它应该很容易导入和运行。


答案 2

如果你使用Spring,你可以使用它的类,叫做UnsafeUtils

org.springframework.objenesis.instantiator.util.UnsafeUtils

public final class UnsafeUtils {
    private static final Unsafe unsafe;

    private UnsafeUtils() {
    }

    public static Unsafe getUnsafe() {
        return unsafe;
    }

    static {
        Field f;
        try {
            f = Unsafe.class.getDeclaredField("theUnsafe");
        } catch (NoSuchFieldException var3) {
            throw new ObjenesisException(var3);
        }

        f.setAccessible(true);

        try {
            unsafe = (Unsafe)f.get((Object)null);
        } catch (IllegalAccessException var2) {
            throw new ObjenesisException(var2);
        }
    }
}

推荐