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