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

Posted

技术标签:

【中文标题】如何获取 sun.misc.Unsafe 的实例?【英文标题】:How do I get the instance of sun.misc.Unsafe? 【发布时间】:2012-10-11 19:35:50 【问题描述】:

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

我总是遇到安全异常。我列出了 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;

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

【问题讨论】:

值得注意的是,这是故意未记录的,不仅因为它不安全,不是 Java API 的正式部分,也没有正式支持,而且还因为您打算“构建您的自己的光剑”:如果您自己无法弄清楚如何获取Unsafe 的实例,那么您可能对JVM 不够了解,无法使用 Unsafe 而不会引起问题. 【参考方案1】:

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

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

编辑

以下引自这段代码所属项目的描述。

“所有这些示例和代码 sn-ps 的实现都可以在 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);
        
    

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于如何获取 sun.misc.Unsafe 的实例?的主要内容,如果未能解决你的问题,请参考以下文章

Java sun.misc.unsafe类的使用

sun.misc.unsafe

java的sun.misc.Unsafe类

java对象的内存布局:利用sun.misc.Unsafe获取类字段的偏移地址和读取字段的值

sun.misc.Unsafe 记录在哪里? [关闭]

找不到方法 sun.misc.Unsafe.defineClass