编译器如何查找Swing对应的javax包,导入路径为何无需加base等前缀?

问题解答
导入时不需要加模块名前缀的原因
你在模块视图里看到的java.base.javax、java.desktop.javax属于模块名+包名的组合展示,模块名本身不属于包全限定名的组成部分。
Java的包命名体系和模块体系是两层独立逻辑:模块是JDK 9引入的JPMS(Java平台模块系统)中用来封装、组织包的上层单元,不会修改包本身的全限定名。比如java.desktop模块包含的Swing相关包,全限定名从始至终都是javax.swing.*,java.desktop只是标识该包的所属模块,编写import语句时自然不需要加模块名前缀。
编译器识别Swing所属模块的逻辑
JDK官方的所有模块严格遵循不导出重复全限定名包的规则,不同模块下的javax开头包不存在命名冲突:
- java.base模块导出的是
javax.net、javax.security、javax.crypto这类基础扩展包 - java.compiler模块仅导出
javax.tools这一个javax开头的包 - java.desktop模块导出的是
javax.swing、javax.imageio、javax.accessibility这类桌面端相关包
所有官方模块导出的javax开头包的全限定名完全唯一,因此编译器只要读取到导入类的全限定名,就能直接匹配到唯一对应导出了该包的模块,不会和其他模块的javax包混淆。
如果使用传统classpath而非模块路径运行项目,JPMS的模块隔离规则不会生效,编译器会直接在所有classpath依赖中搜索对应全限定名的类,也不会出现识别错误的问题。
内容的提问来源于stack exchange,提问作者NewProgrammer
相关产品推荐
相关产品推荐

