Java 9 个嵌套(分层或 Parent/Child)模块
Java 9 Nested (Hierarchical or Parent/Child) Modules
是否可以在 Java9 中创建基于继承(或嵌套)的模块?
像这样:
module a
|
├── module a1
|
└── module a2
在此示例中,a1
和 a2
模块都是 a
的子模块。
如果我导入任一子模块,我将获得父模块 (a
) 的功能以及该子模块中定义的任何功能。也就是说,我可以导入 a1
,并明确获得对 a
和 a1
(但不是 a2
)的功能的访问权限。
a1
和a2
都是a
,可以访问a
的所有包,而不必暴露[=15=的包] 给他们。
您可以 模拟 结合使用 requires transitive
和 exports to
语法:
requires transitive
:指定导入此模块将固有地导入另一个模块。您可以使用它来确保 a1
和 a2
导致 a
被导入。
exports to
:这将允许您仅将功能导出到特定模块;这将允许您 a
授予对 a1
和 a2
公开导出的危险功能的访问权限。
因此,举个例子:
module a {
exports com.internal to a1;
exports com.internal to a2;
}
module a1 {
requires transitive a;
}
module a2 {
requires transitive a;
}
在这种情况下,如果消费者依赖 a1
,他们将固有地依赖 a
(因此获得两者的效用)和 com.internal
包,虽然可见a1
供内部使用,不会对消费者在外部可见。
这与您要求的不完全一样。 a1
是 而不是 和 a
。此外,a1
不能成为 和 a
; JLS 不允许在导出中使用通配符(即:exports * to a1
,这仍然不会使 a1
成为 a
,但从实用的角度来看会使其更接近),并且模块中不存在允许它的其他语法。
是否可以在 Java9 中创建基于继承(或嵌套)的模块?
像这样:
module a
|
├── module a1
|
└── module a2
在此示例中,a1
和 a2
模块都是 a
的子模块。
如果我导入任一子模块,我将获得父模块 (a
) 的功能以及该子模块中定义的任何功能。也就是说,我可以导入 a1
,并明确获得对 a
和 a1
(但不是 a2
)的功能的访问权限。
a1
和a2
都是a
,可以访问a
的所有包,而不必暴露[=15=的包] 给他们。
您可以 模拟 结合使用 requires transitive
和 exports to
语法:
requires transitive
:指定导入此模块将固有地导入另一个模块。您可以使用它来确保a1
和a2
导致a
被导入。exports to
:这将允许您仅将功能导出到特定模块;这将允许您a
授予对a1
和a2
公开导出的危险功能的访问权限。
因此,举个例子:
module a {
exports com.internal to a1;
exports com.internal to a2;
}
module a1 {
requires transitive a;
}
module a2 {
requires transitive a;
}
在这种情况下,如果消费者依赖 a1
,他们将固有地依赖 a
(因此获得两者的效用)和 com.internal
包,虽然可见a1
供内部使用,不会对消费者在外部可见。
这与您要求的不完全一样。 a1
是 而不是 和 a
。此外,a1
不能成为 和 a
; JLS 不允许在导出中使用通配符(即:exports * to a1
,这仍然不会使 a1
成为 a
,但从实用的角度来看会使其更接近),并且模块中不存在允许它的其他语法。