小编Yah*_*ski的帖子

Platform ClassLoader 到底加载了哪些类?

假设我们使用的是 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 加载开发人员可能需要的公共类型的系统模块?如果是这样,哪些特定的包(或者更好地问,模块?)属于这个“可能”?

提前致谢。

java jvm classloader

5
推荐指数
1
解决办法
616
查看次数

标签 统计

classloader ×1

java ×1

jvm ×1