尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
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记录捕获范围、异常类型、跳转地址实现异常拦截。
RELATED

相关推荐

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

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

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

📅 2026/10/4 17:09:30
影刀RPA 数据去重实战:找出Excel中的重复记录

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

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

📅 2026/10/17 14:17:13
美团开发岗高频算法题清单

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

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

📅 2026/10/17 10:00:22
MORE NEWS

更多资讯

📰

uniapp海外游戏分发工程:PG电子集成与Switch卡带区域适配

简介:这是一套面向海外游戏业务开发者的全栈前端解决方案,基于UniApp框架实现跨平台兼容,专为构建海外游戏交易平台、手游下载站及Switch游戏卡带销售系统设计。资源包含完整可二次开发的前端源码(非编译后产物)&#…

📰

Qoder NEXT:智能代码补全工具的技术解析与应用

1. 项目概述Qoder NEXT作为新一代智能编程辅助工具,其核心突破在于通过深度优化代码补全算法,将AI生成代码的开发者采纳率提升了65%。这个数字背后代表着编程效率的实质性飞跃——开发者不再需要花费大量时间在重复性代码编写和机械性调试上,…

📰

32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统…

📰

从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你…

📰

AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年…

📰

Go并发调度器MPG模型与工作窃取算法解析

1. Go并发调度器的设计哲学Go语言最引以为傲的特性就是其原生支持的并发模型。与传统的线程池方案不同,Go的并发调度器采用了一种称为MPG模型的独特设计。这种设计源于Rob Pike等人对现代多核处理器架构的深刻理解——当CPU核心数量越来越多时,基于操作系…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬