【问题标题】:How do I get the instance of sun.misc.Unsafe?如何获取 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 而不会引起问题.

标签: java 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
      

      【讨论】:

        猜你喜欢
        • 2019-07-08
        • 1970-01-01
        • 2023-03-03
        • 2015-01-19
        • 2017-03-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多