Java类加载器(ClassLoader)及其相关类 简介
在此完整列出 Java 中与类加载器(ClassLoader)相关的所有类、抽象类、接口,以及它们之间的关系,我们聚焦于 Java 标准库中与类加载机制直接相关的核心类和接口。
类加载器是 Java 运行时的重要组件,负责加载类文件并将其转换为 JVM 可执行的类对象。
本文会详细列出相关类、接口和抽象类,描述它们的作用,并阐明它们之间的继承、实现和协作关系。
1. 类加载器相关类的概述
Java 的类加载机制主要围绕 java.lang.ClassLoader
类及其相关类和接口。以下是与类加载器直接相关的核心类、抽象类和接口(基于 Java 17,主要参考 java.lang
和 jdk.internal.loader
包):
核心类和接口
-
类(Classes):
java.lang.ClassLoader
:类加载器的核心抽象类,提供加载类的基本功能。java.lang.BootClassLoader
(内部类):引导类加载器,负责加载核心 Java 库(如rt.jar
或modules
)。java.lang.PlatformClassLoader
(Java 9+):平台类加载器,加载平台特定的类。java.lang.AppClassLoader
(Java 9+):应用类加载器,加载应用程序的类路径中的类。jdk.internal.loader.BuiltinClassLoader
:Java 内部实现类,PlatformClassLoader
和AppClassLoader
的父类。jdk.internal.loader.URLClassPath
:辅助类,管理类路径(URL 列表)以加载类文件。jdk.internal.loader.ClassLoaderValue
:用于在类加载器中存储键值对的工具类。java.security.SecureClassLoader
:扩展ClassLoader
,提供安全相关的加载功能。java.net.URLClassLoader
:加载来自 URL(文件或网络)的类的具体实现。
-
抽象类(Abstract Classes):
java.lang.ClassLoader
:本身是一个抽象类,提供类加载的基础方法。jdk.internal.loader.AbstractClassLoaderValue
:ClassLoaderValue
的抽象父类,定义键值存储的通用逻辑。
-
接口(Interfaces):
- 无直接接口,但类加载器通过方法签名(如
loadClass
)与 JVM 交互,间接涉及java.lang.reflect
包中的反射接口(如java.lang.reflect.AnnotatedElement
)。
- 无直接接口,但类加载器通过方法签名(如
-
相关辅助类:
java.lang.Class
:表示加载后的类对象,与类加载器密切相关。java.lang.Module
:Java 9+ 模块系统的核心类,与类加载器协作定义模块。java.lang.Package
:表示包信息,由类加载器管理。
类比:图书馆系统
- 类加载器(ClassLoader):像图书馆管理员,负责找到并准备书籍(类)。
- BootClassLoader:像主图书馆,存放核心书籍(如 Java 核心库)。
- PlatformClassLoader 和 AppClassLoader:像分馆,分别存放扩展书籍和用户书籍。
- ClassLoaderValue:像图书馆的索引卡系统,记录特定书籍的附加信息。
- Class:像实际的书籍,是类加载器最终产出的结果。
2. 详细说明每个类/接口
以下是每个类的详细描述,包括其作用、关键方法和与类加载器的关系。
2.1 java.lang.ClassLoader
(抽象类)
- 作用:类加载器的核心抽象类,定义了加载类、资源和定义类的基础方法。所有类加载器(除了引导类加载器)都继承自它。
- 关键方法:
loadClass(String name)
:加载指定名称的类。defineClass(String name, byte[] b, int off, int len)
:将字节数组定义为类对象。findClass(String name)
:子类实现的模板方法,查找类。getResource(String name)
:查找资源(如.properties
文件)。getParent()
:获取父类加载器。
- 特点:使用双亲委派模型(Parent-First Delegation),优先委托父加载器加载类,避免重复加载。
- 关系:所有其他类加载器(如
SecureClassLoader
,URLClassLoader
)的父类。
2.2 java.lang.BootClassLoader
(内部类)
- 作用:引导类加载器(Bootstrap ClassLoader),由 JVM 原生代码(C++)实现,负责加载核心 Java 类库(如
java.lang.String
)。 - 关键点:
- 不是 Java 类,无法直接访问(在 Java 中表现为
null
)。 - 加载
JAVA_HOME/lib
或模块系统中的核心类。
- 不是 Java 类,无法直接访问(在 Java 中表现为
- 关系:
- 是
PlatformClassLoader
的父加载器(逻辑上)。 - 不继承
ClassLoader
,但被 JVM 视为顶层加载器。
- 是
2.3 java.lang.PlatformClassLoader
(Java 9+)
- 作用:平台类加载器,加载 JDK 平台模块中的类(如
java.sql
)。 - 关键点:
- 由 JVM 提供,取代了 Java 8 及以前的扩展类加载器(
ExtensionClassLoader
)。 - 通过模块系统加载特定模块的类。
- 由 JVM 提供,取代了 Java 8 及以前的扩展类加载器(
- 关系:
- 继承
BuiltinClassLoader
。 - 父加载器是
BootClassLoader
。 - 是
AppClassLoader
的父加载器。
- 继承
2.4 java.lang.AppClassLoader
(Java 9+)
- 作用:应用类加载器,加载应用程序类路径(
-cp
或CLASSPATH
)中的类。 - 关键点:
- 默认的类加载器,加载用户代码。
- 支持模块化和传统类路径。
- 关系:
- 继承
BuiltinClassLoader
。 - 父加载器是
PlatformClassLoader
。
- 继承
2.5 jdk.internal.loader.BuiltinClassLoader
(普通类)
- 作用:Java 内部类,为
PlatformClassLoader
和AppClassLoader
提供共享实现逻辑。 - 关键点:
- 管理模块系统和类路径的加载。
- 提供资源查找和类定义的通用方法。
- 关系:
- 继承
SecureClassLoader
。 - 是
PlatformClassLoader
和AppClassLoader
的直接父类。
- 继承
2.6 java.security.SecureClassLoader
- 作用:扩展
ClassLoader
,添加安全相关的功能(如权限检查)。 - 关键点:
- 用于需要安全控制的场景(如 applet 或远程代码加载)。
- 提供
defineClass
的安全版本。
- 关系:
- 继承
ClassLoader
。 - 是
URLClassLoader
和BuiltinClassLoader
的父类。
- 继承
2.7 java.net.URLClassLoader
- 作用:从指定的 URL(文件、JAR 或网络)加载类和资源。
- 关键点:
- 常用于动态加载外部 JAR 包。
- 支持关闭(
close()
方法),释放资源。
- 关系:
- 继承
SecureClassLoader
。 - 使用
URLClassPath
管理 URL 列表。
- 继承
2.8 jdk.internal.loader.URLClassPath
- 作用:辅助类,管理类路径的 URL 列表,负责从 URL 加载类和资源。
- 关键点:
- 提供文件和网络资源的访问逻辑。
- 被
URLClassLoader
和BuiltinClassLoader
使用。
- 关系:
- 与
URLClassLoader
和BuiltinClassLoader
协作,非继承关系。
- 与
2.9 jdk.internal.loader.ClassLoaderValue
(普通类)
- 作用:为类加载器提供键值对存储机制,支持命名空间和惰性计算。
- 关键点:
- 用于存储与类加载器相关的附加数据(如动态代理类)。
- 提供
computeIfAbsent
等方法。
- 关系:
- 继承
AbstractClassLoaderValue
。 - 与
ClassLoader
协作(通过键值存储)。
- 继承
2.10 jdk.internal.loader.AbstractClassLoaderValue
(抽象类)
- 作用:
ClassLoaderValue
的抽象父类,定义键值存储的通用接口。 - 关键点:
- 提供
key()
和isEqualOrDescendantOf
等抽象方法。
- 提供
2.11 java.lang.Class
- 作用:表示 JVM 中的类对象,是类加载器加载的结果。
- 关键点:
- 提供反射功能(如获取方法、字段)。
- 每个
Class
实例关联一个ClassLoader
(通过getClassLoader()
)。
- 关系:
- 由
ClassLoader
创建,非继承关系。
- 由
2.12 java.lang.Module
- 作用:表示 Java 9+ 模块系统中的模块,与类加载器协作定义模块边界。
- 关键点:
- 定义模块的依赖和导出。
- 与
ClassLoader
一起管理模块化类加载。
- 关系:
- 与
ClassLoader
和Class
协作,非继承关系。
- 与
2.13 java.lang.Package
- 作用:表示 Java 包信息,由类加载器管理。
- 关键点:
- 提供包的元信息(如版本)。
- 关系:
- 由
ClassLoader
创建,非继承关系。
- 由
3. 类之间的关系
以下是类加载器相关类、抽象类和接口的继承和协作关系,以文本图表形式展示:
3.1 继承关系
java.lang.Object└── java.lang.ClassLoader (抽象类)├── java.security.SecureClassLoader│ ├── jdk.internal.loader.BuiltinClassLoader│ │ ├── java.lang.PlatformClassLoader│ │ └── java.lang.AppClassLoader│ └── java.net.URLClassLoader└── jdk.internal.loader.AbstractClassLoaderValue (抽象类)└── jdk.internal.loader.ClassLoaderValue
- 说明:
ClassLoader
是所有类加载器的根(除了BootClassLoader
,后者由 JVM 实现)。SecureClassLoader
扩展了ClassLoader
,添加安全功能。BuiltinClassLoader
是PlatformClassLoader
和AppClassLoader
的父类,提供模块化支持。URLClassLoader
是独立的分支,用于动态加载。ClassLoaderValue
和AbstractClassLoaderValue
是独立的继承线,用于键值存储。
3.2 协作关系
[BootClassLoader] --> [PlatformClassLoader] --> [AppClassLoader]| | || | |v v v
[Class] <--> [Module] <--> [Package] <--> [ClassLoaderValue]|v
[URLClassPath] <--> [URLClassLoader]
- 说明:
- 双亲委派:
AppClassLoader
的父是PlatformClassLoader
,其父是BootClassLoader
。类加载时优先委托父加载器。 - Class 生成:所有类加载器通过
defineClass
生成Class
对象。 - Module 协作:
Module
与类加载器一起定义模块边界(如类可见性)。 - Package 管理:
Package
由类加载器创建,记录包信息。 - ClassLoaderValue 存储:
ClassLoaderValue
为类加载器提供键值存储,管理附加数据。 - URLClassPath 辅助:
URLClassPath
为URLClassLoader
和BuiltinClassLoader
提供资源加载支持。
- 双亲委派:
4. 补充说明
4.1 为什么没有直接接口?
类加载器机制主要通过 ClassLoader
的抽象方法(如 findClass
)与 JVM 交互,不需要额外的接口。JVM 定义了类加载的规范(通过 JNI 或内部机制),ClassLoader
的子类只需实现这些方法。
4.2 Java 9+ 的变化
- Java 9 引入了模块系统(JPMS),新增了
PlatformClassLoader
和AppClassLoader
,取代了旧的ExtensionClassLoader
和SystemClassLoader
。 BootClassLoader
现在支持模块化加载(加载java.base
等模块)。BuiltinClassLoader
和Module
增强了模块化支持。
4.3 ClassLoaderValue
的特殊性
ClassLoaderValue
是一个辅助工具,虽然不直接参与类加载,但与类加载器密切相关。它通过命名空间管理类加载器的附加数据(如动态代理类),是模块化和动态加载场景的重要组件。
5. 总结
以下是与类加载器相关的所有类、抽象类和辅助类的完整列表,以及它们的主要关系:
- 抽象类:
java.lang.ClassLoader
jdk.internal.loader.AbstractClassLoaderValue
- 普通类:
java.lang.BootClassLoader
(内部实现)java.lang.PlatformClassLoader
java.lang.AppClassLoader
jdk.internal.loader.BuiltinClassLoader
java.security.SecureClassLoader
java.net.URLClassLoader
jdk.internal.loader.URLClassPath
jdk.internal.loader.ClassLoaderValue
java.lang.Class
java.lang.Module
java.lang.Package
- 接口:无直接接口,类加载器通过方法签名与 JVM 交互。
关系总结:
- 继承:
ClassLoader
是核心,SecureClassLoader
、BuiltinClassLoader
等扩展其功能,ClassLoaderValue
继承AbstractClassLoaderValue
。 - 协作:类加载器通过双亲委派模型协作,生成
Class
和Package
,与Module
管理模块化,ClassLoaderValue
提供键值存储,URLClassPath
辅助资源加载。