发布时间:2026/7/16 0:44:34
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/7/16 0:44:34

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

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

2026/7/16 0:39:34

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

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

2026/7/16 0:39:34

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

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

2026/7/16 4:50:22

Python图形编程入门:从Tkinter基础到桌面应用打包实战

1. 项目概述:为什么你需要关注Python图形编程?如果你已经能用Python写一些脚本,处理数据或者爬取网页,但总觉得自己的程序少了点“人味儿”——一个能直接交互、看得见摸得着的界面,那么图形编程就是你下一步该探索的领…

2026/7/16 4:50:22

腾讯混元Hy3:Agent向大模型如何从聊天机器人升级为任务执行者

上周在帮一个游戏工作室做AI助手方案选型时,团队里有个刚入行的开发问了个挺有意思的问题:“现在这么多大模型,为什么还要专门强调‘Agent向’这个概念?不都是输入问题输出答案吗?”这个问题让我意识到,很多…

2026/7/16 4:50:22

C++实现一级反应速率计算:数值拟合与工程实践详解

1. 项目概述最近在整理一些化学动力学相关的旧代码,翻出来一个用C实现一级反应速率计算的工具。这玩意儿虽然看着简单,就是解个微分方程,但当年为了把它写得既准确又高效,可没少花心思。一级反应在化学、生物、药学甚至环境科学里…

2026/7/16 4:50:22

湍流模型(1)——从雷诺分解到统计矩:构建湍流分析的数学框架

1. 湍流为什么需要统计学描述?想象一下你站在河边观察水流。平静的水面下,水流缓慢而有序,每个水分子的运动轨迹几乎可以预测。但当水流加速、遇到障碍物时,水面突然出现无数大小不一的漩涡,水流方向变得杂乱无章——这…

2026/7/16 4:50:22

如何通过CS:GO高手录播提升游戏水平:从观察到实战的完整指南

1. 先搞清楚这类录播内容到底适合谁看如果你对 CS:GO 这款游戏有一定了解,或者想通过观看高水平玩家的实战录像来提升自己的游戏理解,那么这类由知名玩家“茄子”在 5EPL 平台上的录播内容,确实值得一看。这类录播的核心价值不在于它是不是最…

2026/7/16 4:45:22

ABB机器人码垛算法核心逻辑与IO接口设计实战解析

1. ABB机器人码垛算法核心逻辑解析第一次接触ABB码垛程序时,我被它的数学美感惊艳到了。想象一下把一堆纸箱整齐码放的场景,背后其实是一套精妙的数学计算。核心算法主要解决三个问题:如何确定每个箱子的位置、如何规划最优路径、如何应对现场…

2026/7/15 17:04:06

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南

3步解锁音乐自由:ncmdumpGUI终极NCM文件解密转换指南 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换,Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 你是否曾在网易云音乐下载了心爱的歌曲&#…

2026/7/15 22:21:34

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境

CANoe 19 SP3 配置 GB/T 27930-2023 A类系统:3步搭建BMS仿真测试环境随着新能源汽车行业的快速发展,充电通信协议的标准化和测试验证变得尤为重要。GB/T 27930-2023作为中国智能充电协议的最新版本,对充电机与电动汽车之间的通信提出了更严格…

2026/7/15 23:18:22

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡

3步搞定RTL8852BE驱动:从零开始配置Wi-Fi 6网卡 【免费下载链接】rtl8852be Realtek Linux WLAN Driver for RTL8852BE 项目地址: https://gitcode.com/gh_mirrors/rt/rtl8852be 还在为Linux系统无法识别RTL8852BE Wi-Fi 6网卡而烦恼吗?&#x1f…

2026/7/16 0:04:06

AD9215BRUZRL7-105是一款工业 10bit 流水线模数转换器

型号介绍AD9215BRUZRL7-105 是一款10 位单通道高速流水线模数转换器,它采用模拟单电源独立供电 数字驱动分离供电双电源架构,模拟电源 AVDD 额定 3V,允许工作区间 2.7V~3.3V;数字驱动电源 DRV 独立设计,支持 2.25V~3.…

2026/7/16 0:04:06

LTC4418IUF#TRPBF是一款工业级双通道控制器

型号介绍LTC4418IUF#TRPBF 是一款工业级双通道电源路径控制器,它芯片采用 20 引脚 4mm4mm QFN 封装,底部附带外露散热焊盘作为 21 号 GND 引脚,热阻 θJA 为 47℃/W、θJC 仅 4.5℃/W,散热性能适配大功率切换场景;温区…

2026/7/16 0:04:06

uos-exporter核心组件解析:10个关键监控导出器功能详解

uos-exporter核心组件解析:10个关键监控导出器功能详解 【免费下载链接】uos-exporter uos-exporter collects metrics from os 项目地址: https://gitcode.com/openeuler/uos-exporter 前往项目官网免费下载:https://ar.openeuler.org/ar/ uos-…

2026/7/15 13:36:32

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…