我正在通读 JDK9 release notes并发现信息不足。
其中一段,写着:
The classes in many non-core modules are now defined to the platform class loader rather than the boot class loader. This may impact code that creates class loaders with null as the parent class loader and assumes that all platform classes are visible to the parent class loader.
基于这一段,我试图找出 Java 中什么是核心模块和非核心模块,但找不到任何答案。
我还尝试运行一个简单的程序来检查来自不同模块的类的类加载器,但到目前为止有时它返回 null (这意味着 boot 类加载器)有时它返回 PlatformClassLoader。
我不想手动检查所有模块。是否有一些被认为是核心和非核心的模块列表?
谢谢。
最佳答案
手动检查所有模块很容易,使用 ModuleLayer.boot().modules()
。
为了完整起见,您还应该在命令行上添加 --add-modules=ALL-MODULE-PATH
VM 选项:
public class ModuleCL {
public static void main(String[] args) {
Map<ClassLoader, Set<Module>> moduleMap = new HashMap<>();
for (var m : ModuleLayer.boot().modules()) {
ClassLoader cl = m.getClassLoader();
Set<Module> modules = moduleMap.computeIfAbsent(cl, __ -> new HashSet<>());
modules.add(m);
}
for (var e : moduleMap.entrySet()) {
System.out.println(e.getKey());
for (var m : e.getValue()) {
System.out.println(" " + m);
}
}
}
}
使用 Java 18 在(我的机器)上输出:
null module java.rmi module java.xml module java.datatransfer module jdk.nio.mapmode module jdk.jfr module jdk.naming.rmi module java.naming module java.management.rmi module jdk.net module jdk.management.jfr module java.management module java.logging module jdk.sctp module java.security.sasl module jdk.management.agent module java.instrument module jdk.unsupported module java.base module java.desktop module java.prefs module jdk.management jdk.internal.loader.ClassLoaders$PlatformClassLoader@2f2c9b19 module java.net.http module java.transaction.xa module jdk.dynalink module java.scripting module jdk.crypto.mscapi module jdk.crypto.ec module jdk.localedata module jdk.security.jgss module jdk.jsobject module java.security.jgss module java.sql.rowset module jdk.accessibility module jdk.zipfs module java.xml.crypto module java.sql module jdk.naming.dns module jdk.charsets module java.smartcardio module java.compiler module jdk.security.auth module jdk.xml.dom module jdk.httpserver module jdk.crypto.cryptoki jdk.internal.loader.ClassLoaders$AppClassLoader@1d44bcfa module jdk.attach module jdk.internal.le module jdk.jpackage module jdk.internal.opt module jdk.jdeps module jdk.compiler module jdk.jartool module jdk.javadoc module jdk.internal.ed module jdk.jlink module jdk.internal.jvmstat module jdk.editpad module jdk.random module jdk.jdwp.agent module jdk.jshell module jdk.unsupported.desktop module jdk.jconsole module jdk.jstatd module jdk.jdi
This file defines the mapping of the different modules to the different loaders
关于java - 什么被认为是 Java 核心模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72927583/