sun.misc.Unsafe是否在JDK9中公开?

时间:2017-10-16 20:36:31

标签: java java-9

我刚试过JDK9并发现sun.misc.Unsafe现在不包含本地方法,但会将它们委托给某些jdk.internal.misc.Unsafe,例如:

@ForceInline
public int getInt(Object o, long offset) {
    return theInternalUnsafe.getInt(o, offset);
}

反过来,最新的看起来就像旧的sun.misc.Unsafe,但现在这些方法都注释了一些注释:

@HotSpotIntrinsicCandidate
public native void putObject(Object o, long offset, Object x);

那么,它是否安全"使用Unsafe启动JDK9?它现在是公共官方API吗?

2 个答案:

答案 0 :(得分:6)

这是一个很好的解释:

  

https://adtmag.com/blogs/watersworks/2015/08/java-9-hack.aspx

     

如何处理Java 9中的sun.misc.Unsafe?一方说它很简单   一个糟糕的旧日应该被摆脱的可怕的黑客;该   另一方面表示,它的大量使用是造成Java崛起的原因   基础设施空间和流行工具仍然需要它。问题   是的,双方都是对的。   ...

     

在OpenJDK邮件列表上写一下,Reinhold提出了封装   模块中不受支持的内部API,包括sun.misc.Unsafe   定义和使用它们。该提案现在是一个正式的Java   增强建议(JEP)。本周发表的JEP 260(" Encapsulate   大多数内部API")旨在制作大多数JDK的内部API   默认情况下无法访问,但留下一些关键,广泛使用   内部API可访问,直到所有人都支持替换   或大部分功能。"

简短回答:你不应该在任何你从头开始开发的新应用程序中使用它。

答案 1 :(得分:6)

@paulsm4的解释足以知道是否进一步使用它。

长答案〜JEP 260: Encapsulate Most Internal APIs

  

他们为什么决定删除/弃用API的支持   用了很久?

有用

The Modular JDKJEP 200 中,限制对非标准,不稳定和不受支持的API 的访问,这些是 JDK的内部实现细节通过利用 The Module SystemJEP 261 提高平台的完整性和安全性,因为许多内部API都定义了特权,安全敏感操作。从长远来看,这一变化将降低JDK本身的维护者以及有意或无意使用这些内部API的库和应用程序所承担的成本。

  

是否计划封装所有内部API?

分类

以上指定的JDK内部API分为两大类: -

  • 非关键内部API ,它们似乎不是由JDK之外的代码使用,或仅为了方便而被外部代码使用。

  • 关键内部API ,它提供了在JDK本身之外实现(例如sun.misc.Unsafe)很难(如果不是不可能)的关键功能。

  

如果某人正在迁移已经使用Unsafe的代码但最终计划离开的代码该怎么办?

sun.misc.Unsafe

其中一个未封装在JDK 9中的关键内部API,因为在同时大多数其他API被封装或弃用以在将来的版本中删除时,JDK 8中不存在受支持的替换。

  

sun.misc.Unsafe在JDK9中是否公开?

  • <强> 用法

    目前要访问关键内部API,例如Unsafe,需要在jdk.unsupported模块上定义一个依赖项,该模块是专门为此目的定义的:

    module jdk.unsupported {
        exports sun.misc;
        opens sun.misc;
        ...
    }
    

尽管它可以回答你的问题,你甚至不会发现这个模块documented,可能是为了限制消费者使用它,而且显然是避免让它成为“公共”。

  • <强>移植

    Unsafe类中的许多方法的功能已通过 Variable Handles JEP 193 提供。

    < / LI>