无法从 java.base 模块导出包

Unable to export a package from java.base module

使用 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)

class 定义为 -

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

public class CompareAndSwap {

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

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

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

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

虽然 IDE 将 module-info.java 反映为未使用,但可能这就是我无法像上面那样定义 module com.jigsaw.npe 的原因。

正在寻求有关如何正确放置模块的帮助-info.java and/or 除了我错过的任何东西。

模块 java.base 没有 export the package jdk.internal.misc., so the type jdk.internal.misc.Unsafe is not accessible - 因此编译失败。

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

# 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) 代码时,您必须这样做。

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

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

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 中受支持