Java Class 加载过程
概述
Java的类加载过程是指将编写好的Java源代码文件(.java)转换为可执行的Java字节码文件(.class)的过程。在Java中,类的加载过程是由Java虚拟机(JVM)的类加载器负责完成的。类加载过程包括加载、验证、准备、解析和初始化五个阶段。下面我将以表格形式展示整个过程的步骤,并逐步讲解每个阶段需要做的事情。
类加载过程
阶段 | 描述 |
---|---|
加载阶段 | 将类的字节码文件加载到内存中,并创建对应的Class对象 |
验证阶段 | 验证字节码文件的正确性和安全性 |
准备阶段 | 为类的静态变量分配内存空间,并设置默认初始值 |
解析阶段 | 将符号引用解析为直接引用 |
初始化阶段 | 执行静态变量的赋值和静态代码块的初始化 |
加载阶段
在加载阶段,类加载器会根据类的全限定名(包名+类名)查找并读取类的字节码文件,然后将其加载到内存中,并创建一个对应的Class对象。
Class<?> clazz = Class.forName("com.example.MyClass");
以上代码中,Class.forName
方法用于加载类,并返回一个Class
对象。参数是类的全限定名。
验证阶段
在验证阶段,虚拟机会验证字节码文件的正确性和安全性,确保它符合Java虚拟机规范。
// 无需手动编写验证代码,由JVM自动完成验证过程
验证过程由JVM自动完成,无需我们手动编写验证代码。
准备阶段
在准备阶段,虚拟机为类的静态变量分配内存空间,并设置默认初始值。静态变量在此阶段被称为“准备阶段的静态变量”。
public class MyClass {
public static int num; // 准备阶段的静态变量
// ...
}
在上述代码中,num
是一个静态变量,它在准备阶段会被赋予默认值0(int类型的默认初始值)。
解析阶段
在解析阶段,虚拟机将符号引用(如类、方法、字段的符号引用)解析为直接引用(直接指向内存地址的引用)。
// 无需手动编写解析代码,由JVM自动完成解析过程
解析过程由JVM自动完成,无需我们手动编写解析代码。
初始化阶段
在初始化阶段,虚拟机执行静态变量的赋值和静态代码块的初始化。静态变量在此阶段被称为“初始化阶段的静态变量”。
public class MyClass {
public static int num; // 准备阶段的静态变量
static {
// 初始化阶段的静态代码块
num = 10; // 初始化阶段的静态变量赋值
}
// ...
}
在上述代码中,静态代码块中的代码会在类初始化阶段执行,将准备阶段的静态变量num
赋值为10。
总结
Java类加载过程是由Java虚拟机的类加载器完成的,包括加载、验证、准备、解析和初始化五个阶段。在每个阶段中,我们需要做的事情如下:
- 加载阶段:使用
Class.forName
方法加载类的字节码文件,并获取对应的Class
对象。 - 验证阶段:由JVM自动完成验证过程,无需手动编写验证代码。
- 准备阶段:为类的