jvm之Class文件结构

Class 文件结构

Class 文件是 Java 跨平台的核心,它是二进制字节流格式,与操作系统、硬件无关,JVM 只识别 Class 文件,不直接识别 Java 源码。

一、Class 文件本质

  • 一组以8 位字节为基础的二进制流
  • 由 JVM 规范严格定义,所有 Java 编译器(javac、kotlinc 等)都必须遵守
  • 结构固定、紧凑、无任何分隔符

二、完整结构(固定顺序)

Class 文件按固定顺序存储以下内容,缺一不可:

1
2
3
4
5
6
7
8
9
10
ClassFile {
魔术因子
主次版本号
常量池计数器 + 常量池
访问标志
类索引、父类索引、接口索引集合
字段表计数器 + 字段表
方法表计数器 + 方法表
属性表计数器 + 属性表
}

三、核心组成详解

1. 魔术因子(Magic Number)

  • 固定值:0xCAFEBABE
  • 作用:JVM 用来快速判断这是不是一个合法的 Class 文件
  • 4 字节,位于文件最开头

2. 版本号

  • 次版本号(2 字节)
  • 主版本号(2 字节)
  • 决定 Class 文件能运行在哪个版本的 JVM 上
    • JDK 8 = 52
    • JDK 11 = 55
    • JDK 17 = 61

3. 常量池(最核心、最复杂)

Class 文件的 “仓库”,存放所有字面量和符号引用。

包含两类数据:

  1. 字面量
    • 字符串常量
    • 基本类型常量(如 int a=10)
  2. 符号引用
    • 类和接口的全限定名
    • 字段的名称和描述符
    • 方法的名称和描述符

为什么需要符号引用?

Java 编译时不确定内存地址,只有运行时 JVM 才会把符号引用转为直接内存地址。

4. 访问标志

标识类 / 接口的访问信息:

  • public
  • final
  • interface
  • abstract
  • enum
  • annotation

5. 类索引、父类索引、接口索引

  • 类索引:确定当前类的全限定名
  • 父类索引:确定父类
  • 接口索引:确定实现了哪些接口

6. 字段表

描述类中声明的变量

  • 访问修饰符(public/private/static/final…)
  • 字段名称
  • 字段类型
  • 不包含从父类继承的字段

7. 方法表

描述类中的方法

  • 访问修饰符
  • 方法名称
  • 参数、返回值
  • 方法体代码(存在 Code 属性里)

8. 属性表

Class、字段、方法都可以携带属性

最关键:Code 属性

  • 存放方法编译后的字节码指令
  • 操作数栈、局部变量表大小
  • 异常表、行号表等

四、最实用工具:javap -v

直接查看 Class 文件的真实结构:

1
javap -v Hello.class

输出内容包含:

  • 魔术因子
  • 版本号
  • 常量池完整列表
  • 访问标志
  • 字段、方法
  • Code 字节码指令

jvm之Class文件结构
http://hanqichuan.com/2026/04/17/jvm/JVM之Class文件结构/
作者
韩启川
发布于
2026年4月17日
许可协议