【问题标题】:Are non-compilation units in the unnamed package of a named module open?命名模块的未命名包中的非编译单元是否打开?
【发布时间】:2019-09-27 09:53:55
【问题描述】:

我在 JLS 中找不到任何提及,它只讨论了编译单元在未命名包中时如何放置在未命名模块中。

背景:许多库需要用户代码将具有特定名称的配置文件放入未命名(默认)包中。我想知道 JLS 是否保证在使用模块时可以通过ClassLoader::getSystemResourceAsStream 找到这些资源。它似乎有效,但我想有一个来源。

这是有道理的,因为opens "" 没有语法,所以唯一明确的方法就是打开模块本身。

【问题讨论】:

    标签: java compilationunit


    【解决方案1】:

    我认为这很清楚。

    一个未命名的模块会导出其普通编译的每个包 单元与那个未命名的模块相关联。

    一个未命名的模块会打开其普通编译单元的每个包 与那个未命名的模块相关联。

    关于关联:

    主机系统必须将普通编译单元关联到一个 带有未命名模块(第 7.7.5 节)的未命名包,而不是命名模块。

    Source

    注意:这里说的是导出包,不是导出编译单元,所以包中的资源都包含在这个语句中。

    【讨论】:

    • 我应该更清楚一点,我说的是一个命名模块,它包含未命名包中的资源。编辑:我编辑了问题以使其更清楚。
    • 引用 2 涵盖了这一点。如果它们在命名模块中的未命名包中,那么它们仍然放置在未命名模块中
    • 我认为你缺少的是未命名包的编译单元与未命名模块相关联无论是否有任何。这种关联反过来意味着整个包被导出和打开。
    • @ThomasZimmermann 请记住,资源也受封装的约束,如here 所述。不在包中的资源不会被封装。
    • @Thomas 规则包括:“如果资源不在模块中的包中,则不封装资源”。这表明资源可能属于也可能不属于一个包。结合§7.4.2 Unnamed Packages中的“一个没有包声明但至少有一种其他声明的普通编译单元是一个未命名包的一部分”,它只提到普通编译单元可以成为未命名包的一部分。正如迈克尔指出的那样,资源不是这样的单位。
    猜你喜欢
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 2021-09-20
    • 2021-06-27
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多