jvm之Class文件结构
Class 文件结构
Class 文件是 Java 跨平台的核心,它是二进制字节流格式,与操作系统、硬件无关,JVM 只识别 Class 文件,不直接识别 Java 源码。
一、Class 文件本质
- 一组以8 位字节为基础的二进制流
- 由 JVM 规范严格定义,所有 Java 编译器(javac、kotlinc 等)都必须遵守
- 结构固定、紧凑、无任何分隔符
二、完整结构(固定顺序)
Class 文件按固定顺序存储以下内容,缺一不可:
1 | |
三、核心组成详解
1. 魔术因子(Magic Number)
- 固定值:
0xCAFEBABE - 作用:JVM 用来快速判断这是不是一个合法的 Class 文件
- 4 字节,位于文件最开头
2. 版本号
- 次版本号(2 字节)
- 主版本号(2 字节)
- 决定 Class 文件能运行在哪个版本的 JVM 上
- JDK 8 = 52
- JDK 11 = 55
- JDK 17 = 61
3. 常量池(最核心、最复杂)
Class 文件的 “仓库”,存放所有字面量和符号引用。
包含两类数据:
- 字面量
- 字符串常量
- 基本类型常量(如 int a=10)
- 符号引用
- 类和接口的全限定名
- 字段的名称和描述符
- 方法的名称和描述符
为什么需要符号引用?
Java 编译时不确定内存地址,只有运行时 JVM 才会把符号引用转为直接内存地址。
4. 访问标志
标识类 / 接口的访问信息:
publicfinalinterfaceabstractenumannotation
5. 类索引、父类索引、接口索引
- 类索引:确定当前类的全限定名
- 父类索引:确定父类
- 接口索引:确定实现了哪些接口
6. 字段表
描述类中声明的变量:
- 访问修饰符(public/private/static/final…)
- 字段名称
- 字段类型
- 不包含从父类继承的字段
7. 方法表
描述类中的方法:
- 访问修饰符
- 方法名称
- 参数、返回值
- 方法体代码(存在 Code 属性里)
8. 属性表
Class、字段、方法都可以携带属性
最关键:Code 属性
- 存放方法编译后的字节码指令
- 操作数栈、局部变量表大小
- 异常表、行号表等
四、最实用工具:javap -v
直接查看 Class 文件的真实结构:
1 | |
输出内容包含:
- 魔术因子
- 版本号
- 常量池完整列表
- 访问标志
- 字段、方法
- Code 字节码指令
jvm之Class文件结构
http://hanqichuan.com/2026/04/17/jvm/JVM之Class文件结构/