17

使用 IDEA-EAP 进行 JDK9 开发实验。

我收到以下错误 -

Error:(3, 20) java: package jdk.internal.misc is not visible  
(package jdk.internal.misc is declared in module java.base, which does
not export it to module com.jigsaw.npe)

类定义为 -

package experiment;
import jdk.internal.misc.Unsafe;

public class CompareAndSwap {

    static Unsafe UNSAFE = Unsafe.getUnsafe();
    ...
}

我尝试module-info.java在使用 IDE 创建的模块中也包含一个文件,其中包含以下语句 -

module com.jigsaw.npe {
    requires java.base;
}

目录结构现在看起来如图所示 -

目录结构

IDE 虽然反映了module-info.java未使用的情况,这可能是我无法定义上述module com.jigsaw.npe尝试的原因。

寻找有关如何正确放置 module-info.java 和/或我错过的任何其他内容的帮助。

4

2 回答 2

22

模块java.base导出jdk.internal.misc.,因此jdk.internal.misc.Unsafe无法访问该类型- 结果编译失败。

您可以通过添加以下命令行选项使其导出包:

# if you want to access it from com.jigsaw.npe only:
--add-exports java.base/jdk.internal.misc=com.jigsaw.npe
# if you want to access from all code:
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED

javac在编译 ( )运行 ( java) 代码时,您必须这样做。

于 2017-03-01T20:10:27.820 回答
20

java.base关于从模块或任何其他模块导出其他未导出的包所需的技术,Nicolai 的回答是正确的。

但是如果目标是使用Unsafe,那么这样做的方法是使用模块sun.misc.Unsafe导出的。jdk.unsupported如果您正在为未命名模块编译代码,则无需对模块执行任何特殊操作即可访问它。如果您在模块中编译代码,则需要添加

requires jdk.unsupported;

到你的module-info.java文件。

要使用Unsafe,您必须执行反射setAccessible技术来访问该字段,这与您在以前的 JDK 版本中必须执行的操作相同:

import sun.misc.Unsafe;

...

Field theUnsafeField = Unsafe.class.getDeclaredField("theUnsafe");
theUnsafeField.setAccessible(true);
Unsafe theUnsafe = (Unsafe)theUnsafeField.get(null);

即使Unsafejdk.unsupported模块中,根据JEP 260 ,JDK 9 也支持此技术。

于 2017-03-03T10:43:56.300 回答