类加载过程包括加载、验证、准备、解析、初始化五步:首先由类加载器读取字节码生成Class对象(加载),随后校验字节码合法性(验证),接着为静态变量分配内存并设默认值(准备),再将符号引用转为直接引用(解析),最后执行静态代码块和赋值语句完成初始化(初始化),其中初始化仅在特定条件下触发,且遵循双亲委派模型。

Java 类加载过程是指 JVM 将类的字节码文件(.class)从磁盘或网络读入内存,并完成验证、准备、解析、初始化等一系列动作,最终形成可执行的 java.lang.Class 对象的过程。整个过程由类加载器(ClassLoader)协作完成,遵循“双亲委派模型”,核心阶段共五步:加载、验证、准备、解析、初始化(《Java虚拟机规范》定义),其中“使用”和“卸载”不属于加载子过程。
这是类加载的第一步,目标是把类的二进制字节流(如 class 文件、jar 包内资源、动态生成字节码等)读入内存,生成一个对应的 Class 对象(尚未初始化)。关键点:
确保加载进来的字节码符合 JVM 规范,不会危害虚拟机安全。这是最复杂也最耗时的校验阶段,包括四个子阶段:
CAFEBABE 开头)验证失败会抛出 VerifyError 或其子类(如 IncompatibleClassChangeError)。
立即学习“Java免费学习笔记(深入)”;
为类的静态变量(static 字段)分配内存,并设置默认初始值(不是代码里写的值!)。注意:
static final 的基本类型和字符串字面量——它们属于“编译期常量”,会被直接赋值;其余 static final 对象仍走默认值)private static int a = 123; → 此时 a 被设为 0;而 private static final int b = 456;(字面量)→ 此时 b 就是 456
将常量池内的符号引用(Symbolic References)替换为直接引用(Direct References)。符号引用是文本描述(如类全名、字段名+描述符、方法名+描述符),直接引用是能直接定位到目标的指针、偏移量或句柄。
NoClassDefFoundError(运行时找不到类)、NoSuchFieldError、NoSuchMethodError
真正执行类中定义的 Java 程序代码,即执行 <clinit></clinit> 方法(类构造器,由编译器自动收集所有 static 变量赋值语句和 static 代码块生成)。
new、getstatic、putstatic、invokestatic 字节码指令(对应 new 实例、读写静态字段、调用静态方法)Class.forName("xxx"),注意 Class.forName(name, false, loader) 可跳过初始化)MethodHandle)且该句柄对应的方法句柄解析结果为 REF_getStatic 等<clinit></clinit> 是线程安全的:JVM 保证同一时间只有一个线程执行它,其他线程阻塞等待基本上就这些。类加载不是黑盒,理解每步做什么、何时发生、什么会触发,对排查 NoClassDefFoundError、ClassNotFoundException、静态初始化死锁、双亲委派破坏等问题非常关键。
以上就是java类加载的过程的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号