假设我们使用的是 OpenJDK 20。官方文档说:
平台类加载器负责加载平台类。平台类包括 Java SE 平台 API、它们的实现类以及由平台类加载器或其祖先定义的特定于 JDK 的运行时类。平台类加载器可以用作
ClassLoader实例的父类。
同时,我从Oracle规范中了解到,Bootstrap ClassLoader加载启动JVM所需的核心运行时类。我还了解到 Platform ClassLoader 不会将任何内容加载到空程序中:
jshell> ClassLoader.getPlatformClassLoader().getDefinedPackages();
$1 ==> Package[0] { }
Run Code Online (Sandbox Code Playgroud)
但它从 Java SE加载一些java.sql包,例如:
jshell> java.sql.Connection.class.getClassLoader()
$2 ==> jdk.internal.loader.ClassLoaders$PlatformClassLoader@27fa135a
jshell> ClassLoader.getPlatformClassLoader().getDefinedPackages()
$3 ==> Package[1] { package java.sql }
Run Code Online (Sandbox Code Playgroud)
有些则不然(例如,作为java-se 模块java.util.logging的同一个子模块):
jshell> java.util.logging.ConsoleHandler.class.getClassLoader();
$4 ==> null
Run Code Online (Sandbox Code Playgroud)
我是否正确地指出 Platform ClassLoader 加载开发人员可能需要的公共类型的系统模块?如果是这样,哪些特定的包(或者更好地问,模块?)属于这个“可能”?
提前致谢。