【发布时间】:2019-11-13 10:24:52
【问题描述】:
Java 模块系统是否应该阻止模块通过反射访问其他模块,而不声明正确的模块依赖关系?
例如,当编译这个 hello world Java 11 类时,它从另一个模块调用一个类,正如预期的那样,它不会编译,因为缺少对 java.xml 的依赖:
module m1 {}
package p1;
public class C1 {
public static void main(String[] args) throws Exception {
System.out.println(javax.xml.XMLConstants.XML_NS_URI);
}
}
将模块依赖项添加到java.xml 后,它会按预期编译和运行。
但是,这个类:
module m1 {}
package p1;
public class C1 {
public static void main(String[] args) throws Exception {
System.out.println(Class.forName("javax.xml.XMLConstants").getField("XML_NS_URI").get(null));
}
}
运行并打印结果,无需声明对java.xml的模块依赖:
java -version
openjdk version "11.0.2" 2019-01-15
java -p bin -m m1/p1.C1
http://www.w3.org/XML/1998/namespace
我们能够如此有效地绕过 Java 模块化。
这适用于任何模块到任何其他已解析的模块。
这怎么可能?模块系统是否应该防止这种情况发生?
【问题讨论】:
标签: java java-module java-platform-module-system