类加载的过程通常可以分为以下几个阶段:
1.加载(Loading):
类加载器首先通过类的全限定名(Fully Qualified Name)查找类文件,并将类文件加载到内存中。
加载阶段不仅仅是简单地将字节码读入内存,还包括对字节码进行一些校验,以确保其符合 Java 虚拟机规范。
2.链接(Linking):
链接阶段分为三个子阶段:验证(Verification)、准备(Preparation)和解析(Resolution)。
验证阶段:对加载的字节码进行验证,以确保其符合 Java 虚拟机规范,防止恶意代码的执行。
准备阶段:为类的静态变量分配内存,并设置默认初始值。
解析阶段:将类、方法、字段等符号引用解析为直接引用,这个阶段可能会在某些情况下被延迟到运行时进行。
3.初始化(Initialization):
在这个阶段,类的静态变量会被初始化为指定的值,静态初始化块会被执行。
初始化阶段是类加载过程中的最后一个阶段,它标志着类的加载完成,并且类已经可以被使用。
需要注意的是,类加载过程中的链接和初始化阶段并不一定会立即执行,而是在类被使用到的时候才会触发。此外,类加载过程是线程安全的,JVM 会确保类加载过程的原子性和一致性,避免多个线程同时加载同一个类造成的冲突。