【问题标题】:Is it still possible to use sun.misc.Unsafe in Java 9? [duplicate]在 Java 9 中仍然可以使用 sun.misc.Unsafe 吗? [复制]
【发布时间】:2017-11-27 09:19:52
【问题描述】:

在 Java 8 之前,可以通过如下方法获得单例 sun.misc.Unsafe 实例:

public static Unsafe getUnsafe() {
    try {
        Field f = Unsafe.class.getDeclaredField("theUnsafe");
        f.setAccessible(true);
        return (Unsafe) f.get(null);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

尽管强烈建议不要使用 Unsafe,但许多供应商和库在内部使用它。

现在,使用 Java 9 和 Jigsaw,我认为处理 Unsafe 的方式也发生了变化。我读了一些带有相反信息的帖子。有人说它已经完全隐藏,甚至无法检索,有人说必须启用 VM 标志,而其他人则认为现在应该正式支持。

那么:在 Java 9 中是否仍然可以使用 sun.misc.Unsafe,如果可以,如何使用?

【问题讨论】:

  • 没有java.misc.Unsafe 这样的东西。有sun.misc.Unsafe,它受到一般sun.* 软件包警告的影响,自 1997 年以来我见过的每个 JDK 版本中都存在这种警告。
  • sun.misc.Unsafe 在 JDK 9 上的工作方式与在 JDK 8 上的工作方式相同。有关所有详细信息,请参阅 JEP 260。你遇到了什么问题?
  • 正确的结尾问题应该是,“如果是这样,为什么?”。

标签: java reflection native java-9 unsafe


【解决方案1】:

不仅获得它保持不变,而且他们还为它添加了更多方法。问题是这现在是一个承诺,它将在未来的某个时间被删除;这次是肯定的。

现在还有 两个,一个:sun.misc.Unsafejdk.internal.misc.Unsafe。第一个是要删除的。

第二个也可以在 java-9 中获得,但只能使用特殊键 addExports:java.base/jdk.internal.misc=ALL-UNAMED(但强烈建议不要这样做)。

改变的是,许多公共方法已被修补或添加,因此您不再需要使用它,例如 AtomicInteger#weakCompareAndSet 并没有达到您的预期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多