关于 Java module 的讨论

查看 22|回复 0
作者:Dlin   
之前一直没有用起来 module 这个特性,就算项目升级到 11 或 17,也是顺利过渡(未添加 module-info.java )但是最近报错未命名模块不能访问 java.base 模块下的未 open 的内容,所以今天学习了一下 module 这个特性。
因此也产生了疑惑。情景如下:
我建立了两个项目,项目 A 创建了 module-info.java 导出了但未进行 open com.txcf,包下有一个类 AA ,其中有一个私有变量 a ;
另一个项目 B 实验情况如下:
第一次创建了 module-info.java 我试图通过反射访问 A 模块 AA 类的私有变量 a,报错:InaccessibleObjectException ,这是预期发生的情况。
第二次我删除了 module-info.java ,该模块变为未命名模块,我试图通过反射访问 AA 类的私有变量 a,却能访问了。
奇怪的是我在第一次和第二次的情况中都不能访问 java.util 中的类的私有成员变量,比如 ArrayList 中的 size 变量。
我在通过 debug 时发现,第一次的情况,调用类和被调用类的 class 获取到的 Module 是两个不同的模块(这也符合预期情况),但是第二次的情况获取的 Module 却是相同的 Module 实例(都是未命名模块)
问题:
1 、非 jdk 官方模块在被未命名模块导入时,被导入模块无论是否命名都会直接导入到未命名模块吗?
2 、问题 1 成立(实验似乎也如此)的话,为何 jdk 官方只保护自己的模块,不保护第三方已命名模块呢?或者说是可以有参数开启保护的呢?
您需要登录后才可以回帖 登录 | 立即注册

返回顶部