当前位置: 首页 > news >正文

2 Class文件结构

1. 基础概念

1.1 什么是字节码

1.Java 源码.java经过 javac编译器编译后,生成.class字节码文件2.字节码不是机器码:不能直接给操作系统CPU执行,只能被JVMJava虚拟机) 解析执行3.字节码:**二进制文件**,由16进制数字组成

2. .class 文件整体结构

字节码文件是严格有序的二进制流,固定顺序 10 大组成部分,缺一不可:

1.魔数(Magic4字节2.版本号(Minor+Major4字节3.常量池(ConstantPool) 变长4.访问标志(AccessFlags2字节5.类索引this_calss、父类索引super_class、接口索引集合interfaces6.字段表集合(fields) 变长7.方法表集合(methods) 变长8.属性表集合(attributes) 变长

1)魔数 Magic(4 字节)
固定值:0xCAFEBABE(咖啡宝贝,Java 咖啡文化命名)
作用:JVM 加载文件第一时间校验魔数,不是这个值直接判定不是合法 class 文件,加载失败

2)版本号(4 字节)

  • 前 2 字节:次版本号 Minor Version
  • 后 2 字节:主版本号 Major Version
    版本对应关系举例:
  • JDK8 = 52.0
  • JDK11 = 55.0
  • JDK17 = 61.0
    规则:高版本 JVM 能运行低版本字节码;低版本 JVM 不能运行高版本 class。

3)常量池 Constant Pool(字节码最核心、最大部分)

class 文件的资源仓库,存储所有字符串、类名、方法名、字段名、字面量、符号引用。是class文件最复杂的部分。

1.结构:

  • 开头 2 字节:常量池容量constant_pool_count(计数器,实际常量数量 = count-1,下标从 1 开始,0 空置)
  • 后面连续 N 个常量项,每个常量第一项 1 字节标记常量类型 tag标记

2.常见常量类型 tag标记

  1. 作用
避免重复存储字符串,复用常量; 所有代码里的类、方法、变量都通过下标引用常量池,大幅压缩class体积

示例:代码String s = "hello",“hello” 存在 Utf8 常量。

4)访问标志 access_flags(2 字节)
二进制位标识当前类的修饰符,如publicfinalinterfaceabstractenum

常用标记:

  • 0x0001 ACC_PUBLIC:public 类
  • 0x0010 ACC_FINAL:final 不可继承
  • 0x0200 ACC_INTERFACE:接口
  • 0x0400 ACC_ABSTRACT:抽象类

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

1.this_class:2字节,常量池下标,代表当前类;2.super_class:2字节,父类索引;所有类父类默认Object(除Object本身);3.interfaces:接口数组,存储本类实现的所有接口常量池下标。

6)字段表集合 fields
存储当前类所有成员变量(静态变量 + 实例变量):

每个字段结构包含:访问标志、字段名索引、描述符索引、属性表(如常量值、注解)。

描述符规则:
I=int,J=long,D=double,L + 类名;= 对象,[= 数组
例:String name描述符Ljava/lang/String;

7)方法表集合 methods(重点,存放方法字节码指令)
每个方法对应一个方法表,结构:

  1. 访问标志:public/private/static/final 等
  2. 方法名索引:常量池下标(init 构造、clinit 静态代码块、自定义方法)
  3. 方法描述符:参数 + 返回值
  4. 属性表:最重要属性Code属性,存放方法执行字节码指令

特殊方法:

  • <init>:实例构造方法,new 对象时调用;
  • <clinit>:静态构造方法,类加载时执行静态变量、静态代码块。

8)属性表 attributes
附加信息,遍布类、字段、方法中,常用属性:

  1. Code:方法的字节码指令、局部变量表、操作数栈、行号映射;
  2. LineNumberTable:源码行号与字节码行映射,异常堆栈打印行号依赖它;
  3. LocalVariableTable:局部变量名称,调试时能看到变量名;
  4. SourceFile:记录源码文件名(如 Test.java);
  5. Exceptions:方法声明抛出的异常;
  6. Signature:泛型信息(泛型编译擦除,靠该属性保留泛型)。

3. 字节码指令

3.1 执行模型:基于栈的虚拟机

JVM 执行方法时依赖两块内存:

  1. 操作数栈:临时存放计算数据(入栈、出栈运算);
  2. 局部变量表:存放方法入参、局部变量,数组结构,下标访问。
    所有字节码指令都是操作「栈」和「局部变量表」。
3.2 常见字节码指令分类 + 示例
(1)加载 / 存储指令:局部变量 ↔ 操作数栈
  • iload_0:int 局部变量 0 压入栈(方法第一个参数默认 0 下标)
  • istore_1:栈顶 int 存入局部变量 1
  • aload:引用类型加载
  • 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){returna+b;}}
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]

  1. a 压栈 → 栈:[a]
  2. b 压栈 → 栈:[a,b]
  3. iadd 弹出两个值,计算 a+b,结果压栈
  4. ireturn 返回结果

4. 类加载过程与字节码的关系

  1. 加载:磁盘读取.class二进制字节流到内存;
  2. 验证:校验魔数、版本、字节码指令合法性,防止恶意破坏字节码;
  3. 准备:静态变量分配内存、赋默认值;
  4. 解析:把常量池符号引用转为直接内存地址;
  5. 初始化:执行<clinit>静态代码块。

整个过程全部基于解析 class 字节码文件。

5. 字节码的关键特性

5.1 泛型擦除

编译时泛型会被擦除,字节码中只保留原始类型;仅通过Signature属性保留泛型元数据,反射才能获取泛型。

List<String>list=newArrayList<>();// 字节码里实际是 List

5.2 自动装箱 / 拆箱语法糖

Integer i = 10字节码自动补充Integer.valueOf(10)
int a = i补充i.intValue()

5.3 循环、foreach 语法糖

foreach 遍历数组/集合会编译成普通for循环+迭代器调用,字节码看不到 foreach 关键字。

5.4 字符串拼接+

JDK8 及以前:字符串 + 编译为StringBuilder链式 append;
JDK9+:使用invokedynamic动态字符串拼接优化。

5.5 异常 try-catch

字节码中存在异常表 Exception Table,记录捕获范围、异常类型、跳转地址,实现异常拦截。

http://www.jsqmd.com/news/1196998/

相关文章:

  • 智慧校园基础设施与应用平台:开启教育数字化新篇章
  • 转转回收手机安全吗?数据清除和隐私安全的完整流程拆解 - 资讯焦点
  • 2026房颤智能预警系统真实数据测评|医慧达独占鳌头,全行业避坑全攻略 ## 一、开篇行业行情与测评说明 - 互联网科技品牌测评
  • 百达翡丽中国官方售后服务中心地址电话一览实地考察报告+多信源验证(2026年7月最新) - 百达翡丽服务中心
  • 2026年07月搪瓷冷凝器与搪玻璃管道行业深度解析及主流厂商综合评估 - 甄选服务推荐
  • Proteus进阶:从8×8到16×16点阵屏的硬件设计与软件驱动全解析
  • 如何快速配置openAMDC TLS加密:安全加固完整指南
  • 找安徽硅橡胶电伴热带订购厂家看这几点够了 - 热点品牌推荐
  • 常见网络安全名词
  • 劳力士中国官方售后服务中心|官方电话及服务网点地址权威信息公告(2026年7月最新) - 劳力士服务中心
  • 【高届数艺术人文CPCI会议】第五届公共艺术与人文发展国际学术会议 (ICPAHD 2026)
  • 卡地亚中国官方售后服务中心|官方地址与售后电话权威信息公示(2026年7月更新) - 卡地亚官方售后中心
  • 【武汉餐饮必看】找代运营怕踩坑?这家武汉本土公司,把“透明”刻在了骨子里 - 资讯焦点
  • 智慧校园智能体建设:解锁校园智能化,赋能智慧教育新生态
  • 2026年7月宁波全屋定制工厂选购实用参考指南 - 奔跑123
  • 2026国内选矿设备优质厂家推荐排行榜单梳理 - 奔跑123
  • 不下载软件也能转mp3?3个在线方法实测对比 - 软件工具教程方法
  • 南宁硅PU球场地坪漆工厂选购方法与本地服务优选指南 - 热点品牌推荐
  • 影刀RPA 数据合并:多表关联与拼接
  • 宝玑官方服务项目及价格查询|网点地址与热线权威信息声明(2026年7月最新) - 亨得利钟表维修中心
  • 第七届心理健康与教育、人文发展国际学术会议(MHEHD 2026)
  • NAND FLASH ECC算法演进:从汉明码到BCH的硬件实现与选型指南
  • 大模型语音机器人如何实现复杂意图理解?——从技术原理到SIP协同实践
  • 洪山软件开发公司本地化服务能力及技术落地要点详解 - 热点品牌推荐
  • 欧米茄中国官方售后服务中心|官方电话和维修地址权威信息声明(2026年7月更新) - 欧米茄官方服务中心
  • 智慧校园应用服务系统:驱动教育数字化转型的核心引擎
  • 苹果的“拥抱”与“超越”:解构基于 Google Gemini 的新一代 AI 架构
  • 2026年如何选择靠谱的免洗手液供应商 - 热点品牌推荐
  • “高校生活”网上订餐系统的设计与实现开题报告
  • 鸿蒙 ArkTS 实战:Travel Budget Ledger 从出行记录到状态反馈完整解析