Nam*_*man 14 java java-platform-module-system java-9 java-module module-info
使用IDEA-EAP进行JDK9开发实验.
我收到以下错误 -
Run Code Online (Sandbox Code Playgroud)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();
...
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试module-info.java在使用IDE创建的模块中包含一个文件,其中包含以下语句 -
module com.jigsaw.npe {
requires java.base;
}
Run Code Online (Sandbox Code Playgroud)
目录结构现在看起来如图所示 -
IDE虽然反映了module-info.java未使用的,但可能这就是我无法定义module com.jigsaw.npe上面尝试过的原因.
寻求一些帮助,了解如何正确放置module-info.java和/或除了我错过的以外的任何东西.
Stu*_*rks 16
Nicolai的答案是正确的,从java.base模块或任何其他模块导出未导出的包.
但是如果要使用目标Unsafe,那么这样做的方法是使用模块sun.misc.Unsafe导出的内容jdk.unsupported.如果您正在为未命名的模块编译代码,则无需对模块进行任何特殊操作即可访问它.如果您正在编译模块中的代码,则需要添加
requires jdk.unsupported;
Run Code Online (Sandbox Code Playgroud)
到你的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);
Run Code Online (Sandbox Code Playgroud)
即使Unsafe在jdk.unsupported模块中,根据JEP 260,JDK 9也支持该技术.
Nic*_*lai 13
模块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
Run Code Online (Sandbox Code Playgroud)
在编译(javac)和运行(java)代码时,您必须这样做.