Java类文件结构
二、Class类文件结构
Class文件是一组以8位字节为基础单位的二进制流, 各个数据项目严格按照顺序紧凑地排列在Class文件之中, 中间没有添加任何分隔符, 这使得整个Class文件中存储的内容几乎全部是程序运行的必要数据, 没有空隙存在. 当遇到需要占用8位字节支上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储. 根据Java虚拟机规范的规定, Class文件格式采用一种类似于C语言结构体的伪结构来存储数据, 这种伪结构中只有两种数据类型: 无符号数和表, 后面的解析都要以这两种数据类型为基础, 所以先介绍这两个概念.
无符号数据属于基本的数据类型,以u1, u2, u4, u8来分别代表1个字节,2个字节,4个字节和8个字节的无符号数, 无符号数可以用来描述数字,索引引用,数量值或者按照UTF-8编码构成的字符串值.
表是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯性地以”_info”结尾. 表用于描述有层次关系的复合结构的数据, 整个Class文件本质上就是一张表, 它由下面所示的数据项
类型 |
名称 |
数量 |
U4 |
Magic |
1 |
U2 |
Minor_version |
1 |
U2 |
Major_version |
1 |
C2 |
Constant_pool_count |
1 |
Cp_info |
Constant pool |
Constant_pool_count - 1 |
U2 |
Access_flags |
1 |
U2 |
This_class |
1 |
U2 |
Super_class |
1 |
U2 |
Interfaces_count |
1 |
U2 |
Interfaces |
Interfaces_count |
U2 |
Fields_count |
1 |
Field_info |
Fields |
Fields_count |
U2 |
Methods_count |
1 |
Method_info |
Methods |
Methods_count |
U2 |
Attributes_count |
1 |
Attribute_info |
Attributes |
Attributes_count |
无论是无符号数还是表, 当需要描述同一类型但数量不定的多个数据时,经常会使用一个前置的容量计数器加若干 个连续的数据项的形式, 这时称这一系列连续的某一类型的数据为某一类型的集合.
Class结构不像XML等描述语言,由于它没有任何分隔符号,所以在上表中的数据项,无论是顺序还是数量,甚至于数据存储的字节序(Byte Ordering, Class文件中的字节序为Big-endian)这样的细节,都是被严格限定的,哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变. 下面我们来看看表中的各项的含义.