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)这样的细节,都是被严格限定的,哪个字节代表什么含义,长度是多少,先后顺序如何,都不允许改变. 下面我们来看看表中的各项的含义.