无法从 java.base 模块导出包

使用 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();
    ...
}

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

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

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

Directory Structure

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

寻找一些关于如何正确放置模块信息的帮助.java和/或除我错过的模块信息之外的任何东西。


答案 1

模块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

在编译 () 运行 () 代码时,您必须执行此操作。javacjava


答案 2

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

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

requires jdk.unsupported;

添加到您的文件。module-info.java

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

import sun.misc.Unsafe;

...

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

即使位于模块中,JDK 9 也支持此技术,符合 JEP 260Unsafejdk.unsupported


推荐