2 Class文件结构

发布时间:2026/9/13 15:57:58

2 Class文件结构 1. 基础概念1.1 什么是字节码1.Java 源码.java经过 javac编译器编译后生成.class字节码文件2.字节码不是机器码不能直接给操作系统CPU执行只能被JVMJava虚拟机 解析执行3.字节码**二进制文件**由16进制数字组成2. .class 文件整体结构字节码文件是严格有序的二进制流固定顺序 10 大组成部分缺一不可1.魔数Magic4字节2.版本号MinorMajor4字节3.常量池ConstantPool 变长4.访问标志AccessFlags2字节5.类索引this_calss、父类索引super_class、接口索引集合interfaces6.字段表集合fields 变长7.方法表集合methods 变长8.属性表集合attributes 变长1魔数 Magic4 字节固定值0xCAFEBABE咖啡宝贝Java 咖啡文化命名作用JVM 加载文件第一时间校验魔数不是这个值直接判定不是合法 class 文件加载失败。2版本号4 字节前 2 字节次版本号 Minor Version后 2 字节主版本号 Major Version版本对应关系举例JDK8 52.0JDK11 55.0JDK17 61.0规则高版本 JVM 能运行低版本字节码低版本 JVM 不能运行高版本 class。3常量池 Constant Pool字节码最核心、最大部分class 文件的资源仓库存储所有字符串、类名、方法名、字段名、字面量、符号引用。是class文件最复杂的部分。1.结构开头 2 字节常量池容量constant_pool_count计数器实际常量数量 count-1下标从 1 开始0 空置后面连续 N 个常量项每个常量第一项 1 字节标记常量类型 tag标记2.常见常量类型 tag标记作用避免重复存储字符串复用常量 所有代码里的类、方法、变量都通过下标引用常量池大幅压缩class体积示例代码String s hello“hello” 存在 Utf8 常量。4访问标志 access_flags2 字节二进制位标识当前类的修饰符如public、final、interface、abstract、enum常用标记0x0001 ACC_PUBLICpublic 类0x0010 ACC_FINALfinal 不可继承0x0200 ACC_INTERFACE接口0x0400 ACC_ABSTRACT抽象类5类索引、父类索引、接口索引1.this_class2字节常量池下标代表当前类2.super_class2字节父类索引所有类父类默认Object除Object本身3.interfaces接口数组存储本类实现的所有接口常量池下标。6字段表集合 fields存储当前类所有成员变量静态变量 实例变量每个字段结构包含访问标志、字段名索引、描述符索引、属性表如常量值、注解。描述符规则IintJlongDdoubleL 类名 对象[ 数组例String name描述符Ljava/lang/String;7方法表集合 methods重点存放方法字节码指令每个方法对应一个方法表结构访问标志public/private/static/final 等方法名索引常量池下标init 构造、clinit 静态代码块、自定义方法方法描述符参数 返回值属性表最重要属性Code属性存放方法执行字节码指令特殊方法init实例构造方法new 对象时调用clinit静态构造方法类加载时执行静态变量、静态代码块。8属性表 attributes附加信息遍布类、字段、方法中常用属性Code方法的字节码指令、局部变量表、操作数栈、行号映射LineNumberTable源码行号与字节码行映射异常堆栈打印行号依赖它LocalVariableTable局部变量名称调试时能看到变量名SourceFile记录源码文件名如 Test.javaExceptions方法声明抛出的异常Signature泛型信息泛型编译擦除靠该属性保留泛型。3. 字节码指令3.1 执行模型基于栈的虚拟机JVM 执行方法时依赖两块内存操作数栈临时存放计算数据入栈、出栈运算局部变量表存放方法入参、局部变量数组结构下标访问。所有字节码指令都是操作「栈」和「局部变量表」。3.2 常见字节码指令分类 示例1加载 / 存储指令局部变量 ↔ 操作数栈iload_0int 局部变量 0 压入栈方法第一个参数默认 0 下标istore_1栈顶 int 存入局部变量 1aload引用类型加载astore引用类型存储2常量入栈指令bipush 10数字 10 压栈ldc #2从常量池 #2 取出字符串 / 数字入栈3运算指令栈顶弹出两个数计算结果压回栈iadd整数相加isub减法、imul 乘法、idiv 除法4控制跳转指令if 判断、循环if_icmpge两 int 对比大于等于则跳转goto无条件跳转return方法正常返回ireturn返回 int、areturn返回对象5对象、数组指令new #3创建类常量池 #3 对应类invokespecial调用构造方法invokevirtual调用实例普通方法多态invokestatic调用静态方法invokeinterface调用接口方法getfield/putfield获取 / 设置实例字段getstatic/putstatic获取 / 设置静态字段publicclassTest{publicintadd(inta,intb){returnab;}}publicintadd(int,int);Code:0:iload_1// 局部变量1(a)入栈1:iload_2// 局部变量2(b)入栈2:iadd// 栈顶两数相加结果入栈3:ireturn// 返回栈顶int执行流程局部变量表 [0:this, 1:a, 2:b]a 压栈 → 栈[a]b 压栈 → 栈[a,b]iadd 弹出两个值计算 ab结果压栈ireturn 返回结果4. 类加载过程与字节码的关系加载磁盘读取.class二进制字节流到内存验证校验魔数、版本、字节码指令合法性防止恶意破坏字节码准备静态变量分配内存、赋默认值解析把常量池符号引用转为直接内存地址初始化执行clinit静态代码块。整个过程全部基于解析 class 字节码文件。5. 字节码的关键特性5.1 泛型擦除编译时泛型会被擦除字节码中只保留原始类型仅通过Signature属性保留泛型元数据反射才能获取泛型。ListStringlistnewArrayList();// 字节码里实际是 List5.2 自动装箱 / 拆箱语法糖Integer i 10字节码自动补充Integer.valueOf(10)int a i补充i.intValue()5.3 循环、foreach 语法糖foreach 遍历数组/集合会编译成普通for循环迭代器调用字节码看不到 foreach 关键字。5.4 字符串拼接JDK8 及以前字符串 编译为StringBuilder链式 appendJDK9使用invokedynamic动态字符串拼接优化。5.5 异常 try-catch字节码中存在异常表 Exception Table记录捕获范围、异常类型、跳转地址实现异常拦截。
延伸阅读

更多相关文章

2026/9/12 14:45:24

OpenHarmony 自定义通用弹窗 全局弹窗工具封装(API Version23+)

摘要 ArkUI 原生弹窗分为 AlertDialog、TextPickerDialog、CustomDialog,原生写法存在大量重复代码:弹窗构造器重复创建、无统一淡入淡出动画、无法全局快捷调用、弹窗层级冲突、页面销毁弹窗残留、多弹窗叠加错乱。基于 CustomDialogController 封装全…

2026/9/12 15:12:10

影刀RPA 数据去重实战:找出Excel中的重复记录

title: “影刀RPA 数据去重实战:找出Excel中的重复记录” date: 2026-07-01 author: 林焱 影刀RPA 数据去重实战:找出Excel中的重复记录 从多个系统导出的数据,同一条记录可能出现多次。手动查重靠肉眼或COUNTIF公式,数据一大效率…

2026/9/12 15:55:48

美团开发岗高频算法题清单

美团开发岗的算法难度整体不一定最卷,但有一个很鲜明的特点:题目很贴近后台开发常见的数据结构能力。 也就是说,美团更像是在通过算法题看你是不是一个扎实的后台工程师,而不是单纯看你刷了多少偏题怪题。 美团算法面试特点 偏经…

2026/9/13 15:57:50

SpringAI框架:企业级AI应用开发实践指南

1. SpringAI框架概述SpringAI是Spring生态系统针对AI工程领域推出的应用框架,它将Spring的设计哲学(如可移植性、模块化设计)引入人工智能领域。这个框架的核心价值在于解决企业数据/API与AI模型之间的连接难题,让开发者能够用熟悉…

2026/9/13 15:52:50

OpenCode工具链:AI驱动的智能开发实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/13 0:01:16

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/12 6:29:36

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/12 14:32:17

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/13 11:18:28

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码