信息发布→ 登录 注册 退出

j*a类加载的过程

发布时间:2025-12-05

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

java类加载的过程

J*a 类加载过程是指 JVM 将类的字节码文件(.class)从磁盘或网络读入内存,并完成验证、准备、解析、初始化等一系列动作,最终形成可执行的 j*a.lang.Class 对象的过程。整个过程由类加载器(ClassLoader)协作完成,遵循“双亲委派模型”,核心阶段共五步:加载、验证、准备、解析、初始化(《J*a虚拟机规范》定义),其中“使用”和“卸载”不属于加载子过程。

1. 加载(Loading)

这是类加载的第一步,目标是把类的二进制字节流(如 class 文件、jar 包内资源、动态生成字节码等)读入内存,生成一个对应的 Class 对象(尚未初始化)。关键点:

  • 不关心字节码来源:可以是本地文件系统、JAR/ZIP、网络(如 Applet)、运行时动态生成(如 ASM、CGLIB)、甚至数据库中存储的字节码
  • 加载后,类还处于“未连接”状态:不能被程序直接使用,也未分配静态变量内存,更未执行静态代码块
  • 加载阶段可能触发其他类的加载(比如当前类引用了另一个未加载的类),但不一定会初始化它(初始化有明确触发时机)

2. 验证(Verification)

确保加载进来的字节码符合 JVM 规范,不会危害虚拟机安全。这是最复杂也最耗时的校验阶段,包括四个子阶段:

  • 文件格式验证:检查魔数、主次版本号、常量池格式等是否合法(比如是否以 CAFEBABE 开头)
  • 元数据验证:检查类是否有父类、是否继承了 final 类、是否实现了抽象方法等语义正确性
  • 字节码验证:对方法体进行数据流分析,确保操作数栈不会溢出、类型匹配、跳转指令不会跳到方法外等
  • 符号引用验证:在解析阶段前做初步检查(如类、字段、方法是否存在且可访问)

验证失败会抛出 VerifyError 或其子类(如 IncompatibleClassChangeError)。

3. 准备(Preparation)

为类的静态变量(static 字段)分配内存,并设置默认初始值(不是代码里写的值!)。注意:

Mootion Mootion

Mootion是一个革命性的3D动画创作平台,利用AI技术来简化和加速3D动画的制作过程。

Mootion 251 查看详情 Mootion
  • 仅针对 static 变量(包括 static final 的基本类型和字符串字面量——它们属于“编译期常量”,会被直接赋值;其余 static final 对象仍走默认值)
  • 例如:private static int a = 123; → 此时 a 被设为 0;而 private static final int b = 456;(字面量)→ 此时 b 就是 456
  • 此时不会执行任何 J*a 代码(如 static 块、构造器、赋值表达式)

4. 解析(Resolution)

将常量池内的符号引用(Symbolic References)替换为直接引用(Direct References)。符号引用是文本描述(如类全名、字段名+描述符、方法名+描述符),直接引用是能直接定位到目标的指针、偏移量或句柄。

  • 解析动作可能在初始化前、后,甚至运行时才发生(“懒解析”),但虚拟机规范允许在加载、准备、初始化任一阶段执行
  • 主要解析四类符号引用:类或接口、字段、类方法、接口方法
  • 典型异常:NoClassDefFoundError(运行时找不到类)、NoSuchFieldErrorNoSuchMethodError

5. 初始化(Initialization)

真正执行类中定义的 J*a 程序代码,即执行 <clinit></clinit> 方法(类构造器,由编译器自动收集所有 static 变量赋值语句和 static 代码块生成)。

  • 这是类加载过程的最后一步,也是唯一允许用户代码介入的阶段
  • 有且仅有以下 6 种情况会主动触发初始化(其他情况只加载不初始化):
    • 遇到 newgetstaticputstaticinvokestatic 字节码指令(对应 new 实例、读写静态字段、调用静态方法)
    • 使用反射(如 Class.forName("xxx"),注意 Class.forName(name, false, loader) 可跳过初始化)
    • 初始化子类时,若父类未初始化,则先初始化父类
    • 虚拟机启动时,用户指定的主类(含 main 方法的类)被初始化
    • 使用 JDK 1.7+ 的动态语言支持(如 MethodHandle)且该句柄对应的方法句柄解析结果为 REF_getStatic 等
    • 接口定义了 default 方法,且该接口的实现类初始化时,该接口也会被初始化(仅限首次)
  • <clinit></clinit> 是线程安全的:JVM 保证同一时间只有一个线程执行它,其他线程阻塞等待

基本上就这些。类加载不是黑盒,理解每步做什么、何时发生、什么会触发,对排查 NoClassDefFoundErrorClassNotFoundException、静态初始化死锁、双亲委派破坏等问题非常关键。

以上就是j*a类加载的过程的详细内容,更多请关注其它相关文章!


相关文章: Composer如何在生产环境安全地执行composer update  汽水音乐车机版8.9下载 汽水音乐车机版8.9版本安装入口  word中如何让数字纵向排列_Word数字纵向排列方法  俄罗斯搜索引擎Yandex指南 附2025年免登录官网入口  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  TikTok国际版官网直达_TikTok国际版官网直达进入在线观看  Kafka Streams中基于消息头条件过滤消息的实现指南  Win11怎么开启省电模式_Win11电池节电模式自动开启  在WordPress中通过REST API访问受BasicAuth保护的站点内容  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  C++如何跨平台操作文件和目录_C++17标准库std::filesystem的使用教程  在哪找SublimeJ远程工具_SFTP插件配置教程  Spyder启动失败:字体文件权限拒绝错误解决方案  在WordPress中通过REST API获取BasicAuth保护的远程文章  wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法  Eclipse怎么运行工程_Eclipse工程运行配置说明  Golang如何优化内存分配与垃圾回收_Golang内存管理与GC优化实践  如何使用Node.js csv 包按条件移除含空字段的CSV记录  excel怎么提取文本中数字 excel函数提取技巧  深入理解Google Cloud Datastore查询:祖先路径与数据一致性  Excel文件在线转换快速入口 Excel在线格式转换网站  抖音商城签到领现金是真的吗_抖音商城签到奖励与提现说明  C++如何进行游戏物理模拟_使用Box2D库为C++游戏添加2D物理效果  uc浏览器网页版极速入口 uc网页浏览器网页版流畅体验  J*a递归快速排序中静态变量的状态管理与陷阱  C++如何解决segmentation fault_C++段错误调试与原因分析  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法  12306几点到几点不能订票? | 官方最新系统维护时间全解析  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  outlook中文官网入口地址 outlook官方中文版直达首页链接  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  Surface怎么安装系统 微软Surface Pro U盘重装win11教程  抖音创作助手登录入口_抖音创作辅助工具官网直达  在J*a中如何使用ForkJoinPool进行分治任务并行处理_ForkJoinPool分治并行技巧说明  深入理解J*a链表中的IPosition接口与使用  J*aScript中赋值与自增运算符的复杂交互与执行机制  动漫岛观看全网网 动漫岛在线正版动漫入口  照顾宝贝2小游戏免费秒玩入口  CKEditor 5 自定义构建在React应用中渲染失败的调试与解决  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  2026春节假期时间安排 2026春节假日查询  初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解  如何在CSS中使用visited与link控制链接颜色_visited link伪类配合  在Pyomo中实现基于变量的条件约束:Big-M方法详解  如何在J*a中使用Locale处理多语言环境  iwriter统一登录平台 iwrite账号密码登录页面  基于多条件高效更新SQL表:利用CASE表达式优化业务逻辑  mc.js免安装版 mc.js一键畅玩入口 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!