You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何调用Blah.class.getModule()返回Unnamed Module而非BlahModule?

如何让类的getModule()返回指定的命名模块?

要让Blah.class.getModule()返回你的BlahModule,必须满足以下几个核心条件:

1. 编译单元与模块声明正确关联

  • 你的module-info.java必须和模块内所有类的源代码处于统一的目录结构中。比如模块根目录下直接放module-info.java,类文件按包结构放在该目录下的子文件夹里。
  • 编译时要将整个模块的源代码作为编译输入,不能单独编译单个类文件。例如使用javac时,要包含module-info.java和所有模块内的类文件,而不是只编译Blah.java。

2. 用模块路径而非类路径进行编译和运行

  • 编译阶段:使用javac的--module-source-path参数指定模块源代码路径,或者直接将模块目录作为编译源,示例命令:
    javac -d output-dir --module-source-path src src/blahmodule/module-info.java src/blahmodule/com/example/Blah.java
    
  • 运行阶段:必须通过模块路径加载模块,而不是把类文件放到类路径。示例启动命令:
    java --module-path output-dir --module blahmodule/com.example.YourMainClass
    
    如果把类文件放到类路径运行,即使有module-info.class,类也会被归到未命名模块。

3. 保证模块声明的可观察性

根据Java语言规范7.2的描述,模块与编译单元的关联取决于模块声明的可观察性,具体来说:

  • 编译时,编译器必须能找到module-info.java,不能把它排除在编译范围外。
  • 运行时,包含module-info.class的模块目录或Jar包必须在模块路径上,让JVM能识别到这是一个命名模块。

4. 禁止单独加载模块内的类

如果只单独编译Blah.java(不编译module-info.java),或者运行时只将Blah.class放到类路径,这个类会被JVM判定为未关联命名模块的编译单元,从而归到未命名模块(符合Java语言规范7.7.5的描述)。必须确保整个模块的字节码(包括module-info.class)一起通过模块路径加载。

内容的提问来源于stack exchange,提问作者davidalayachew

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 20:44:50