Class文件结构解析
2022/3/19 23:31:03
本文主要是介绍Class文件结构解析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 前言
- 一、class文件结构
- 二、魔数与Class文件的版本号
- 常量池
- 访问标志
- 类索引、父类索引与接口索引集合
- 总结
前言
java语言能很好地保持向后兼容,class文件结构的稳定性功不可没,下面来介绍class文件的结构
一、class文件结构
class文件是一组以8字节为基础单位的二进制流,各个数据项严格按照顺序紧凑的排列在文件中,中间没有添加任何分隔符。当遇到需要占用8个字节以上空间的数据项时,则会按照高位在前的方式分割 成若干个8个字节进行存储。
《java虚拟机规范》中规定,Class文件采用类似于C语言结构体的伪结构来存储数据,这种伪结构只有两种数据类型:“无符号数”,“表”。
- 无符号数:属于基本数据类型,以u1、u2、u4、u8来分别表示1个字节、2个字节、4个字节、8个字节的无符号数,无符号数可以用来描述数字,索引引用,数量值,或按照UTF-8编码构成字符串值。
- 表:是由多个无符号数或者其他表作为数据项构成的复合数据类型,为了便于区分所有表的命名都习惯以“_info”结尾。表用于描述有层次关系的复合数据结构,整个Class文件本质上也可以是做一张表。
表为Class文件格式
二、魔数与Class文件的版本号
Class的结构不像XML等描述语言,由于它没有任何分隔符 号,所以在表中的数据项,无论是顺序还是数量,甚至于数据存储的字节序(Byte Ordering,Class 文件中字节序为Big-Endian)这样的细节,都是被严格限定的,哪个字节代表什么含义,长度是多少, 先后顺序如何,全部都不允许改变。
每个Class文件的头4个字节被称为魔数。它的唯一作用就是确定这个Class文件是否为一个能被虚拟机接受的Class文件。不仅Class文件很过文件格式标准都有使用魔数来进行身份识的习惯。因为Class文件很难被修改。java中的魔数值为 0xCAFEBABE(咖啡宝贝)
紧接着魔数后面的4个字节是Class文件的版本号,第5和第6字节是次版本号,第7第8个字节是主版本号。java的版本号从45开始,jdk1.1后每个大版本发布后都向上加1。
常量池
次、主版本号之后就是常量池入口。常量池可以比喻为Class文件里的资源仓库,它是Class 文件结构中与其他项目关联最多的数据,通常也是占用Class文件空间最大的数据项目之一,另外,它 还是在Class文件中第一个出现的表类型数据项目。
常量池入口
因为常量池的容量不固定,所以在常量池入口需要放置一项u2类型的数据,代表常 量池容量计数值。这个容量计数是从1开始的而不是0。因为0代表特殊含义:“不引用任何一个常量池项目”
常量池中存放两大类常量:字面量和符号引用
访问标志
在常量池结束之后,紧接着的2个字节代表访问标志(access_flags),这个标志用于识别一些类或 者接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract 类型;如果是类的话,是否被声明为final;等等。
类索引、父类索引与接口索引集合
类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,而接口索引集合 (interfaces)是一组u2类型的数据的集合,Class文件中由这三项数据来确定该类型的继承关系。类索 引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。
总结
Class文件格式除了上述之外还有 字段表集合、方法表集合、属性表集合。
这篇关于Class文件结构解析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升