Java 9中的JavaLangAccess和SharedSecrets

11

看起来在Java 9中,sun.misc包中的SharedSecretsJavaLangAccess类被删除了。

在Java 9中是否有这些类提供的功能的替代品?


你究竟是想要使用这些类做什么? - M A
1
例如,可以使用newStringUnsafegetEnumConstantsShared方法。 - Clashsoft
3
内部的 newStringUnsafe 和 getEnumConstantsShared 不应该被 JDK 核心类以外的代码使用。当然,支持的 API 是 String(char[]) 和 Class::getEnumConstants。 - Alan Bateman
2个回答

6

以上两个类都打包在jdk.internal.misc包中。

您可以尝试使用以下选项来访问它们之一

--add-exports <source-module>/<package>=<target-module>(,<target-module>)*

针对您的使用情况,如下:

--add-exports java.base/jdk.internal.misc=your.module

注意:来自 JEP-261:模块系统 的免责声明 -

--add-exports--add-opens 选项必须小心使用。您可以使用它们来访问库模块甚至JDK本身的内部API,但是这样做有风险:如果该内部API被更改或删除,则您的库或应用程序将失败。


1
该软件包似乎是未记录的。它将在未来的Java版本中保留吗?还是开发人员像使用sun.*软件包时一样承担风险? - VGR
3
我相信它们可能会在未来的版本中被删除。添加JEP免责声明以进行说明。 - Naman
6
应强烈劝阻开发者使用 sun.、jdk.internal. 以及其他JDK内部API。因此,我认为建议提交者转而使用内部共享密钥类的新位置不是一个好主意。 - Alan Bateman
2
@AlanBateman,我也同意VGR已经指出的观点。因此,我也在答案中添加了注释。我只是提出了一种实现这个目标的方法,并没有将其定义为必须/应该遵循的方法。毫无疑问,我很乐意投票支持一个能够反映出替换所提到的类及其功能细节的答案。 - Naman

2
根据 Bug#JDK-8137056 的内容,为了准备JEP 160,SharedSecrets和友好接口应该被移出 'sun.misc' 并移到一个真正私有的包中。 现在它们可以在 jdk.internal.misc 中使用。
将 SharedSecrets 和友好接口移动到 jdk.internal.misc

这是否意味着此软件包无需导出要求? - Mani
@ManiGrover 如果你在问关于 sun.misc 的话,是的。根据我的理解,它们实际上并不存在。 - Ravi
询问关于已移动的包jdk.internal.misc? - Mani
2
@ManiGrover,你必须这样做,就像其他答案中提到的那样。 - Ravi
顺便说一下,通过模块的实现,共享秘密的概念不会变得过时吗?模块不是允许您在包之间提供特殊访问路径,同时防止外部代码访问它吗?这是一种更广泛的包私有访问的版本,允许项目在不向其他项目公开实现的情况下内部共享代码。 - HesNotTheStig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接