【问题标题】:What's the difference between requires and requires static in module declaration模块声明中的requires和requires static有什么区别
【发布时间】:2017-10-03 04:37:13
【问题描述】:

模块声明中requiresrequires static模块语句有什么区别?

例如:

module bar {
    requires java.compiler;
    requires static java.base;
}

【问题讨论】:

  • @ZhekaKozlov 虽然我支持重复投票。但不太确定链接的帖子是否说明了两者之间的差异。无论如何,我也相信这个问题背后的主要动机可能是了解 static 指令本身的 static 修饰符。
  • 我不认为这是重复的。虽然这两个问题都涉及同一个主题,但它们的角度却截然不同。搜索语法的人会在这里找到这个问题,而需要将依赖项设为可选的人会发现另一个问题。

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


【解决方案1】:

requires 子句表示在编译和运行时需要所需的模块。因此,当模块系统在module resolution(处理模块描述符和解决依赖关系的阶段)期间遇到这样的子句时,它会搜索可观察模块的宇宙(JDK 中的模块和模块路径上的模块)并抛出一个如果找不到模块,则会出错。

requires static 子句表示a dependency that is optional at run time。这意味着在编译时模块系统的行为与上述完全一样。

另一方面,在运行时,它主要忽略requires static 子句。如果遇到一个,它不会解决它。这意味着,如果一个可观察的模块只被requires static 引用,它不会进入模块图!起初这可能有点令人惊讶。另一方面,如果模块以其他方式进入图表(其他模块需要,added manually with --add-modules,由service binding 绘制),所有对它有可选依赖的模块都可以read它。

【讨论】:

【解决方案2】:

两者的主要区别在于

requires static foo.module;

依赖在静态阶段,编译期间是强制性的,但在动态阶段是可选的,在执行期间,另一方面

requires bar.module;

被添加以声明该模块在编译时和运行时都依赖于其他一些模块,按名称。

【讨论】:

  • 当我需要静态时你能提供用例吗?为什么我只想在编译时有一些依赖?
  • @gstackoverflow lombok 和其他注解处理工具(例如非运行时注解)
  • @Etki 将此作为答案发布,我花了 5 分钟阅读两个答案,仅通过您的评论“得到它”。而这已经是三年来的第三次了!请...
猜你喜欢
  • 1970-01-01
  • 2018-03-12
  • 2018-02-02
  • 2013-02-08
  • 2022-01-13
  • 1970-01-01
  • 2021-03-19
  • 1970-01-01
  • 2017-12-20
相关资源
最近更新 更多