我刚刚尝试了
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);
那么,从 JDK9 开始使用
Unsafe
是否“安全”?现在是公开的官方API了吗?
@paulsm4的解释已经足够好,可以知道是否进一步使用它了。
他们为什么决定删除/弃用 API 支持 用了多久?
在 模块化 JDKJEP 200 中,通过利用 模块系统JEP 261 限制对 非标准、不稳定和不受支持的 API (即 JDK的内部实现细节)的访问 提高了平台的完整性和安全性,因为许多内部 API 定义了特权、安全敏感的操作。从长远来看,此更改将减少 JDK 本身以及有意或无意使用这些内部 API 的库和应用程序的维护者所承担的成本。
内部API是否都计划封装?类别
非关键内部 API 似乎不会被 JDK 外部的代码使用,或者只是为了方便而被外部代码使用..
关键的内部 API,它们提供的关键功能在 JDK 本身之外实现即使不是不可能,也是很困难的(例如,sun.misc.Unsafe
)。
如果有人正在迁移已经使用
Unsafe
的代码,但最终计划离开怎么办?
sun.misc.Unsafe
sun.misc.Unsafe 在 JDK9 中公开了吗?
用法
当前要访问关键的内部 API,例如Unsafe
,需要定义对
jdk.unsupported
模块的依赖关系,该模块是专门为此目的定义的:
module jdk.unsupported {
exports sun.misc;
opens sun.misc;
...
}
尽管它可以回答您的问题,但您甚至不会找到该模块记录,可能是为了限制消费者使用它,并且显然是避免使用它以使其“公开”的标志。
简短的回答:您不应该在从头开始开发的任何新应用程序中使用它。https://adtmag.com/blogs/watersworks/2015/08/java-9-hack.aspx
Java 9 中的 sun.misc.Unsafe 该怎么办?一方面说这很简单 过去糟糕日子里的一个可怕的黑客应该被摆脱;这 另一方则表示,Java 的大量使用是 Java 的崛起的原因 基础设施空间和流行工具仍然需要它。问题 是的,双方都是对的。 ...Reinhold 在 OpenJDK 邮件列表上写道,建议封装 模块内不受支持的内部 API,包括 sun.misc.Unsafe 定义和使用它们。该提案现已成为正式的 Java 增强提案 (JEP)。本周发布,JEP 260(“封装 大多数内部 API”)旨在“使 JDK 的大部分内部 API 默认情况下无法访问,但保留一些关键的、广泛使用的 可访问内部 API,直到所有支持的替代品都存在 或它们的大部分功能。”