java - 在 Java 9 中还可以使用 sun.misc.Unsafe 吗?

标签 java reflection native java-9 unsafe

直到 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 标志,而另一些人则说它现在应该得到正式支持。

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

最佳答案

不仅获取它的方式保持不变,而且还添加了更多方法。问题是,现在这是一个 promise ,它将在未来某个时候被删除;这次是肯定的。

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

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

发生的变化是,许多公共(public)方法已被修补或添加,以便您不再需要使用它,例如 AtomicInteger#weakCompareAndSet 并没有执行您的操作会期望。

关于java - 在 Java 9 中还可以使用 sun.misc.Unsafe 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47507418/

相关文章:

java - FusedLocationProviderClient 最多需要 30 秒来检索第一个位置更新

java - 找不到功能 'default' 的元工厂;这通常意味着 axiom-impl.jar 不在类路径中

java - 尝试使用反射在运行时更改属性的值会导致 NullPointerException

android - 在 Android 构建系统中包含预构建的静态库

c++ - 用于 C++ 的小型原生跨平台 GUI 框架

java - 舍入误差?

java - 如何通过Javax.xml库解析XML标签

C#如何判断一个对象是否为多维数组

c# - 如何测试反射字段的类型是指定类型还是继承自指定类型

java - Desktop.getDesktop().browse 挂起