2 Class文件结构

发布时间:2026/10/29 5:07:07

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/10/26 0:41:35

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

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

2026/10/28 6:22:54

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

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

2026/10/25 19:10:32

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

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

2026/10/29 5:03:59

POP设计提升零售转化率的关键要素与实践

1. 项目概述:POP知识点解析POP(Point of Purchase)作为零售营销领域的重要概念,指的是消费者实际完成购买决策的关键接触点。这个概念最早起源于上世纪30年代的美国超市货架陈列研究,如今已发展成为涵盖实体零售终端、…

2026/10/29 5:03:59

深入解析上下文模式:从设计原则到异步传播的工程实践

1. 从“上下文模式”说起:一个被低估的工程概念第一次看到context-mode这个词,很多人会下意识地把它归到某个具体框架的配置项里,比如某个前端库的渲染模式、某个数据库的连接模式,或者某个 AI 工具的对话模式。但真正在工程一线待…

2026/10/29 5:03:59

AI学术写作助手PaperPower:从文献检索到论文润色全流程优化

1. 项目概述:当学术研究遇上AI助手去年帮导师审阅研究生论文时,发现一个有趣现象:80%的学术写作问题其实都有规律可循。那些反复出现的文献格式错误、逻辑断层和表达冗余,完全可以通过智能工具预先规避。这正是PaperPower诞生的背…

2026/10/29 5:03:59

从零搭建可复用技能模块:skills 设计思路与实操避坑指南

1. 从“skills”这个热词说起:它到底是什么最近几个月,不管是在技术社区、开发者群聊,还是在各类效率工具的讨论区,“skills”这个词出现的频率高得离谱。有人把它当成一个插件系统,有人把它当成一套提示词模板&#x…

2026/10/29 4:58:59

Word三线表跨页断行与表头重复:底层逻辑与实操避坑指南

论文写到第三章,表格一多,最怕的就是跨页。上个月帮一位做实证分析的朋友改稿,他发来一张截图,一个回归结果表被分页符拦腰截断,第二页的表头凭空消失,底下还多出一行孤零零的“注:***表示……”…

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/28 15:28:56

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/29 0:03:42

学生选课系统DFD图绘制指南:边界划分与分层校验实战

简介:文档以顶层与第一层DFD图为核心,完整刻画学生选课系统的逻辑模型,面向软件工程课程设计、系统分析学习及毕设前期建模人群。顶层图界定系统边界,外部实体包括管理员、教师和学生三类角色;第一层图进一步细化用户登…

2026/10/29 0:03:42

JIRA敏捷落地:Scrum角色权限、Sprint与燃尽图避坑指南

简介:围绕“基于JIRA的敏捷开发项目管理”这一主题,面向产品负责人、Scrum Master及研发测试成员,梳理Scrum角色分工、迭代流程与JIRA工具配置的对应关系,适合初、中级团队导入敏捷管理时参考。压缩包共1个docx文件,大…

2026/10/29 0:03:42

SEMI S8人机工程验收实战:从条款拆解到现场实测的完整指南

简介:面向半导体设备设计、制造与运维工程师及安全合规人员,这份资料聚焦SEMI标准体系下的设备安全规范,重点收录SEMI S8-0308《半导体制造设备人体工程学工程安全指南》。内容围绕设备设计原则、错误与事故预防、人体工程学适配三大主线展开…

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

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

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