尧图网络 高端网站定制 · 原创设计
免费咨询热线
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/9/24 8:07:04
影刀RPA 数据去重实战:找出Excel中的重复记录

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

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

📅 2026/9/12 9:59:25
美团开发岗高频算法题清单

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

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

📅 2026/9/12 9:59:06
MORE NEWS

更多资讯

📰

VirtualBox E_FAIL (0x80004005) 报错全解析:从驱动冲突到UUID修复

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

MIPI DSI转LVDS桥接方案:LT9211与N76E003配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Windows 11锁屏机制深度解析与分版本禁用方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

SOAP 规范实战:用 XML+HTTP 搭一套可调试的 RPC 骨架,并接入 TaoToken 统一 Key

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

MCP服务发展现状的有趣发现:从stdio到Streamable HTTP,TaoToken统一Key接入实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

Swagger Codegen Java 客户端 StoreApi 实战:okhttp4-gson Parcelable 生成代码的 Store 端点完全指南

开发工具代码生成API设计 【免费下载链接】swagger-codegen swagger-codegen contains a template-driven engine to generate documentation, API clients and server stubs in different languages by parsing your OpenAPI / Swagger definition. 项目地址: http…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬