Java模块封装Demo疑问:默认包类为何能访问受限的模块b.B?
问题原因解析
这是Java模块系统的兼容设计特性导致的,核心逻辑在于模块封装规则和类路径加载的未命名模块之间的特殊关系:
模块封装的作用范围有限:你在模块b中使用
exports b to a;的限定导出规则,仅对模块路径(--module-path)上的显式模块生效。它的作用是阻止其他显式模块(非a)访问包b,但不限制类路径(-cp)上的代码。未命名模块的特殊访问规则:当默认包下的C类通过
-cp加载时,它属于未命名模块。Java模块系统为了兼容旧的非模块化代码,规定:所有显式模块导出的包,都会自动对未命名模块开放——不管你有没有用to做限定导出。反过来,未命名模块的包也对所有显式模块开放。验证与限制方案:
- 若要彻底禁止外部访问b.B类,需确保所有代码都作为显式模块放在模块路径上。比如把C类放到一个新模块c中,此时如果模块b没有
exports b to c;,模块c就无法访问b.B类。 - 如果C类必须在类路径下运行,那无法通过模块系统限制它访问b.B类,这是Java为了向下兼容保留的特性。
- 若要彻底禁止外部访问b.B类,需确保所有代码都作为显式模块放在模块路径上。比如把C类放到一个新模块c中,此时如果模块b没有
内容的提问来源于stack exchange,提问作者Grzegorz Wilanowski
相关产品推荐
相关产品推荐

