Java 9 中的类装入器层次结构新的类装入器实现
从Java 8开始,我知道类装入器的层次结构如下:
Bootstrap 类装入器 → 扩展类装入器 → 应用程序类装入器
Java 9 中类装入器层次结构中有哪些变化,它是如何工作的?
从Java 8开始,我知道类装入器的层次结构如下:
Bootstrap 类装入器 → 扩展类装入器 → 应用程序类装入器
Java 9 中类装入器层次结构中有哪些变化,它是如何工作的?
以下是 Java 9 的迁移指南,
新的类装入器实现
JDK 9 维护自 1.2 发行版以来存在的类装入器层次结构。但是,为了实现模块系统,进行了以下更改:
应用程序类装入器不再是 URLClassLoader 的实例,而是内部类的实例。它是既不是 Java SE 也不是 JDK 模块的模块中的类的缺省装入器。
扩展类装入器已重命名;它现在是平台类装入器。Java SE 平台中的所有类都保证通过平台类装入器可见。此外,在 Java 社区进程下标准化但不是 Java SE 平台一部分的模块中的类保证通过平台类装入器可见。
仅仅因为一个类通过平台类装入器可见并不意味着该类实际上是由平台类装入器定义的。Java SE 平台中的某些类由平台类装入器定义,而其他类则由引导类装入器定义。应用程序不应依赖于哪个类装入器定义了哪个平台类。
JDK 9 中的更改可能会影响创建以 null(即引导类装入器)作为父类装入器的类装入器的代码,并假定所有平台类对父类都可见。可能需要更改此类代码以使用平台类装入器作为父级(请参见 ClassLoader.getPlatformClassLoader)。
平台类装入器不是 URLClassLoader 的实例,而是内部类的实例。
引导类装入器仍然内置于 Java 虚拟机中,并在类装入器 API 中由 null 表示。它定义了一些关键模块中的类,例如java.base。因此,它定义的类比 JDK 8 中的类少得多,因此使用 -Xbootclasspath/a 部署的应用程序或创建父级为 null 的类装入器的应用程序可能需要更改,如前所述。
在 Java-9 中修订的 ClassLoader
指出:
Java 运行时具有以下内置类装入器:
引导类装入器
:虚拟机的内置类装入器通常表示为 null,并且没有父级。
平台类装入器
:为了允许升级/重写定义为平台类装入器的模块,并且升级后的模块读取定义的模块到平台类装入器及其祖先以外的类装入器,那么平台类装入器可能必须委托给其他类装入器,例如应用程序类装入器。换句话说,定义为平台类装入器以外的类装入器的命名模块中的类及其祖先可能对平台类装入器可见。
系统类装入器
:它也称为应用程序类装入器,与平台类装入器不同。系统类装入器通常用于在应用程序类路径、模块路径和特定于 JDK 的工具上定义类。平台类装入器是系统类装入器的父级或祖先,所有平台类都对其可见。