17

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

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

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

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

4

3 回答 3

4

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

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

编辑

下面引用这段代码所属项目的描述。

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

于 2019-01-03T21:32:56.553 回答
1

如果你使用 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);
        }
    }
}
于 2020-01-05T23:46:02.227 回答
0

您可以在以下位置找到另一种方法:

http://mishadoff.com/blog/java-magic-part-4-sun-dot-misc-dot-unsafe/

在不安全的源代码中,您可以找到:

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

您可以使用 Xbootclasspath 将您的类或 jar 添加到引导类路径,如下所示:

java -Xbootclasspath:/usr/jdk1.7.0/jre/lib/rt.jar:. com.mishadoff.magic.UnsafeClient
于 2020-10-26T06:26:36.553 回答