将未导出/未打开的程序包添加到模块信息的ModulePackages的用例是什么?

时间:2018-07-26 06:41:56

标签: java jvm bytecode java-bytecode-asm

JVMS states in section 4.7.26

  

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

何时不导出或打开这样的软件包,添加有意义的软件包何时才有意义?我看不到Java编译器曾经以这种方式添加软件包。

由于ASM也offers a ModuleVisitor::visitPackage method,我对此感到迷茫。

1 个答案:

答案 0 :(得分:1)

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

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

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

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