Java的类加载机制与类加载器
发布时间: 2024-02-13 00:17:55 阅读量: 11 订阅数: 19
# 1. Java类加载机制介绍
## 1.1 类加载的定义及作用
在Java中,类加载是指将类的.class文件中的数据读入到内存中,使程序可以使用这些数据来创建对象、调用方法等操作。类加载的主要作用是将类的字节码文件加载到内存中,并且在JVM中生成对应的Class对象,使得程序可以通过该Class对象获取类的信息并进行操作。
## 1.2 Java虚拟机的类加载过程
Java虚拟机的类加载过程包括加载、链接、初始化三个阶段。其中加载阶段是指通过类的全限定名来获取类的二进制字节流,链接阶段包括验证、准备和解析三个步骤,最后是初始化阶段,该阶段是类加载的最后一个阶段,负责对类进行初始化,包括对静态变量的赋值等操作。
## 1.3 类加载的三个阶段:加载、链接、初始化
- 加载阶段:通过类的全限定名获取类的二进制字节流。
- 链接阶段:包括验证、准备和解析三个步骤,确保类的字节流符合JVM规范,并对静态变量分配内存并赋予初始值。
- 初始化阶段:对类进行初始化,包括对静态变量的赋值等操作。
# 2. 类加载器的分类与特点
Java中的类加载器负责将类的字节码加载到Java虚拟机中,并对其进行解析和初始化。类加载器根据加载类的来源不同,可以分为核心类加载器、扩展类加载器、应用程序类加载器和自定义类加载器,它们各自具有不同的特点和功能。
### 2.1 核心类加载器
核心类加载器负责加载Java虚拟机自身需要的核心类库,如`rt.jar`中的类。这些类加载器是由虚拟机实现提供的,无法直接获取其引用。核心类加载器是启动类加载器,它是由C++实现的,属于虚拟机的一部分,负责加载Java的核心类库,例如`java.lang.Object`等。
### 2.2 扩展类加载器
扩展类加载器负责加载Java虚拟机的扩展类库,位于扩展类路径(`JRE_HOME/lib/ext`)中,或者通过系统属性`java.ext.dirs`指定扩展路径。开发者可以使用扩展类加载器加载自定义的类库。扩展类加载器是Java语言编写的,它的父加载器是启动类加载器。
### 2.3 应用程序类加载器
应用程序类加载器也称为系统类加载器,负责加载应用程序的类路径中的类,即开发者自己编写的类。它的父加载器是扩展类加载器。应用程序类加载器是Java语言编写的,可以通过Java代码获取其引用,如`ClassLoader.getSystemClassLoader()`。
### 2.4 自定义类加载器
自定义类加载器是开发者根据自己的需求编写的加载器,通过继承`java.lang.ClassLoader`类并重写其中的方法来实现。自定义类加载器可以实现特定的加载规则,比如从特定路径加载类、在加载前对类进行加密等。自定义类加载器的实现需要重写以下方法:
- `findClass(String name)`:根据类的全限定名查找并返回类的字节码。
- `loadClass(String name, boolean resolve)`:加载指定类,可以选择是否进行解析。
自定义类加载器一般会继承应用程序类加载器作为其父加载器。
总结:
- 类加载器的分类包括核心类加载器、扩展类加载器、应用程序类加载器和自定义类加载器。
- 核心类加载器负责加载Java虚拟机的核心类库。
- 扩展类加载器负责加载Java虚拟机的扩展类库。
- 应用程序类加载器负责加载应用程序的类。
- 自定义类加载器通过继承`java.lang.ClassLoader`类实现,可以实现特定的加载规则。
# 3. 类加载器的工作原理与过程详解
### 3.1 类加载器的层级关系
Java中的类加载器可以构成一个层级结构,每个类加载器都有一个父加载器,从而形成一个父子关系的树状结构。根据类加载器的作用范围和加载方式的不同,可以将类加载器分为以下几种类型:
- 启动类加载器(Bootstrap ClassLoader):负责加载Java的核心类,如`java.lang.Object`等。是虚拟机自身的一部分,由C++实现,无法被Java程序直接引用。
- 扩展类加载器(Extension ClassLoader):负责加载Java的扩展类,即`java.ext.dirs`系统属性或`java.ext.dir`环境变量指定的路径下的类。它是由Java编写的,是`sun.misc.Launcher$ExtClassLoader`类的实例。
- 应用程序类加载器(Application ClassLoader):也称为系统类加载器(System ClassLoader),负责加载Java应用程序的类路径上的类。它是由Java编写的,是`sun.misc.Launcher$AppClassLoader`类的实例。
- 自定义类加载器(Custom ClassLoader):用户自定义的类加载器,可以继承`java.lang.ClassLoader`类实现自己的加载逻辑。
该层级关系如下图所示:
```
+-------------------+
| Bootstrap |
+-------------------+
↑
+-------------------+
| Extension |
+-------------------+
↑
+-------------------+
| Application |
+-------------------+
```
### 3.2 类加载器的工作流程
类加载器的工作过程可以分为以下几个步骤:
1. 加载(Load):加载器根据类的全限定名查找并读取对应的字节码文件,将其转换为内部数据结构表示的类,并在虚拟机中生成一个`java.lang.Class`的实例对象表示该类。
2. 链接(Link):链接分为三个阶段,包
0
0