sun.misc.Unsafe 在 JDK9 中公开了吗?

问题描述 投票:0回答:2

我刚刚尝试了

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了吗?

java java-9 sun
2个回答
6
投票

@paulsm4的解释已经足够好,可以知道是否进一步使用它了。

长答案〜JEP 260:封装大多数内部API


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

有用性

模块化 JDKJEP 200 中,通过利用 模块系统JEP 261 限制对 非标准、不稳定和不受支持的 API (即 JDK的内部实现细节)的访问 提高了平台的完整性和安全性,因为许多内部 API 定义了特权、安全敏感的操作。从长远来看,此更改将减少 JDK 本身以及有意或无意使用这些内部 API 的库和应用程序的维护者所承担的成本。


内部API是否都计划封装?

类别

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

  • 非关键内部 API 似乎不会被 JDK 外部的代码使用,或者只是为了方便而被外部代码使用..

  • 关键的内部 API,它们提供的关键功能在 JDK 本身之外实现即使不是不可能,也是很困难的(例如,sun.misc.Unsafe

    )。


如果有人正在迁移已经使用

Unsafe

 的代码,但最终计划离开怎么办?

sun.misc.Unsafe

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

sun.misc.Unsafe 在 JDK9 中公开了吗?

  • 用法

    当前要访问关键的内部 API,例如

    Unsafe

    ,需要定义对 
    jdk.unsupported
     模块的依赖关系,该模块是专门为此目的定义的:

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

尽管它可以回答您的问题,但您甚至不会找到该模块记录,可能是为了限制消费者使用它,并且显然是避免使用它以使其“公开”的标志。

  • 迁移

    Unsafe

    类中的许多方法的功能已通过
    变量句柄JEP 193提供。


4
投票
这里有一个很好的解释:

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,直到所有支持的替代品都存在 或它们的大部分功能。”

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

© www.soinside.com 2019 - 2024. All rights reserved.