在Java 9的模块声明中有2个结构:
exports com.foo;
并且
opens com.foo;
exports
授予编译时访问权限,而opens
允许运行时访问,作为反射和资源。
opens
比exports
更宽容,您可以将整个模块定义为打开,结果与显式打开每个包相同:
open module com.mod {
但是没有类似的构造
exported module com.mod {
我的问题:为什么会这样;有什么决定允许一次打开整个模块而不是导出?
答案 0 :(得分:14)
模块的导出定义了它的API,应该刻意设计并保持稳定。一个"导出的模块"可以通过添加,删除或重命名包来轻松地和无意中更改其API,这将违背稳定性目标。 (这与没有"通配符导出"如exports foo.bar.*
)的原因基本相同。
它更广泛(也更有益)的用途是访问工件以为其提供服务(XML / JSON序列化,持久性,依赖注入......)。在这种情况下,反映在模块上的代码不会依赖,因此不会因移动内容而破坏。因此没有理由保持打开的软件包稳定,这使得像开放模块这样的免费方法变得可行。