我刚试过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吗?
答案 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 提供。