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自动完成验证过程,无需手动编写验证代码。
  • 准备阶段:为类的