方法getModule为命名模块中的类返回未命名的模块

Jan*_*sen 20 java java-9

我刚刚开始看看Java 9模块系统,我想知道一个类是否有可能知道它所在的模块.

为此我创建了以下模块

module de.test {
  exports de.test.myexport;
}
Run Code Online (Sandbox Code Playgroud)

并编译了一个看起来像的jar文件

> jar --print-module-descriptor --file=Java9Test-1.0-SNAPSHOT.jar                                

de.test
  requires mandated java.base
  exports de.test.myexport
Run Code Online (Sandbox Code Playgroud)

在包中de.test,我有一个叫做Overview调用的类

Module module = Overview.class.getModule();
Run Code Online (Sandbox Code Playgroud)

但是,返回的模块对象是未命名的,没有ModuleDescriptor.

getModule()在这里使用正确,还是有其他方法加载类的模块?

我在OS X上使用JDK 9 build 120.

Nic*_*lai 17

类路径(with java --class-path ...)上的所有JAR 都捆绑到同一个所谓的未命名模块中,无论它们是"真正的模块"还是"只是一个JAR".当你从这样的JAR中向一个类询问它的模块时,你会得到你描述的结果.

尝试将JAR放在模块路径上(带java --module-path ...)并Class::getModule返回您期望的内容.

  • 谢谢,它完全按照你的描述工作.然而,对我来说,似乎并不直观,"Class :: getModule"的行为取决于类的执行方式. (3认同)