java - 为什么未模块的 JAR 可以访问模块 JAR 的非公开包?

标签 java java-9 java-module module-info

我正在 intelliJ 中使用 Java 9: 我创建了 4 个模块(所有模块都依赖于 module1):

  1. module1:导出包 pkg1 并将 pkg2 导出到模块 2。
  2. module2:需要 module1 并且能够访问这两个包
  3. module3:需要 module1 并且只能访问 pkg1
  4. module4:没有module-info.class,可以访问module1的两个包

我认为自动模块应该要求所有暴露的封装,而不是那些未暴露的。

如果封装仅适用于显式模块 JAR,我不明白封装的意义何在。

我错过了什么?

最佳答案

在您的示例中,module4无法访问pkg2。自动模块读取所有其他模块(因为它们无法表达依赖关系),但 rules to access types未更改,因此只能访问导出包中的公共(public)类型。

基于您的引用的一些背景:

I thought that automatic modules should require all exposed packaged but not the ones which are not exposed.

显式模块(即非自动模块)需要其他模块。在运行时,这些 require 指令是 turned into readability edges 。但它们并不是这些边的唯一来源:对于自动模块,边会添加到每个已解析的模块中(即将其放入可读性图中)。

因此,当您说“自动模块应该需要所有公开的包”时,有一些错误,可能在翻译中丢失,但我仍然想澄清一下。该句子应该改为“自动模块读取所有(已解析)模块”。

现阶段还没有人谈论可访问性和软件包。这是下一步,这里的自动模块并不特殊,因此它们无法访问内部 API。

关于java - 为什么未模块的 JAR 可以访问模块 JAR 的非公开包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47346736/

相关文章:

java - 刷新输入流 : java

java - 实现没有拆分包的(编译时)插件架构

java - 为什么模块路径上的模块需要 --add-modules ?

java - 在舞台中替换场景后如何获取场景的正确位置?

java - 更改一个对象中的值会更改另一个对象中的值

java - 使用 Gradle 6 构建避免拆分包的附加工件

java - 我可以通过 MANIFEST.MF 要求 Java 9 模块吗?

Java 9 模块和类路径 hell : conflicting class names

java - 用 Java 组织、实现和查询数据结构类

java - takeWhile 与过滤器有何不同?