将未导出/未打开的包添加到module-info的ModulePackages的用例是什么?

Raf*_*ter 5 java jvm bytecode java-bytecode-asm

JVMS在第4.7.26规定的是:

ModulePackages属性指示Module属性导出或打开的模块的所有包,以及Module属性中记录的服务实现的所有包.ModulePackages属性还可以指示模块中既不导出也不打开也不包含服务实现的包.

何时在未导出或打开时添加此类包是否有意义?我看不出Java编译器是这样添加包的.

我偶然发现了这一点,因为ASM也提供了一种ModuleVisitor::visitPackage方法.

Raf*_*ter 2

根据艾伦·贝特曼的评论回答我自己的问题:

ModulePackages属性是优化且可选的。如果该属性存在,JVM 可以通过简单地读取该属性来获取模块包的列表。如果此属性不存在,则必须扫描涉及 I/O 的 jar 文件,因此这是不需要的。

如果包列表不完整,运行时将无法从这些包加载类,就好像这些包未包含在 jar 中一样。

该属性是由jar工具添加的,而不是由javac添加的。