为了理解我们的类别:
类路径中的所有类和jar都将是未命名模块的一部分。但为什么我们需要什么呢?自动模块的优势在哪里?我可以“要求”那些该死的传统罐子,使它们成为一个自动模块。我没有把它包括在内吗?
答案 0 :(得分:9)
至少有两个原因:
--add-modules
)。我现在没时间检查第二个,但那是the State of the Module system所说的:
因此,在解析模块图之后,会使自动模块读取所有其他命名模块,无论是自动还是显式
解决方案适用于声明的依赖项,自动模块声明无。
答案 1 :(得分:0)
除了接受的答案中列出的项目外,还有另外一个区别:未命名的模块可以访问Java附带的所有模块软件包,即使它们没有被导出。 只要该类是公共的,访问就可以工作-与Java 9之前的工作相同。但是,从模块路径运行jar时,它将只能访问导出的包。
例如,如果某些.jar
具有以下代码:
com.sun.jmx.remote.internal.ArrayQueue c = new com.sun.jmx.remote.internal.ArrayQueue(10);
当放置在类路径上时,它将正常运行而没有任何警告,但是当从模块路径(作为自动模块)运行时,它将在运行时失败:
Exception in thread "main" java.lang.IllegalAccessError: class test1.C
(in module test1) cannot access class com.sun.jmx.remote.internal.ArrayQueue
(in module java.management) because module java.management does not export
com.sun.jmx.remote.internal to module test1
请注意,这与众所周知的非法反射访问警告不同,后者使用反射来访问私有字段或方法。在这里,我们正在静态(非反射地)访问公共类(但从非导出包中访问)。