Java 类文件结构

Class类文件时一组以字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在Class文件中,没有任何分隔符。对于大于8位的数据均采用大头方式储存,文件中只有无符号数和表两种结构

无符号数有u1,u2,u4,u8,即1,2,4,8位字节,可以用来描述数字,索引引用,数量值或按照utf8编码的字符串值

表是由一组无符号数组成的结构,所有表均以_info结尾,整个Class文件本质上就是一张表,其按照以下数据项依次排列:

magic-->minor_version-->major_version-->constant_pool_count-->constant_pool-->access_flags-->this_class

-->super_class-->interfaces_count-->interfaces-->fields_count-->fields-->methods_count-->methods-->attributes_count-->attributes

1.magic u4

 魔数,Class文件以0xCAFEBABE开头

2.minor_version u2  major_version u2

次版本号和主版本号   jdk1.8的主版本号位52

3.constant_pool_count u2  constant_pool 

常量池,constant_pool_count代表常量池计数器,从1开始计数,所以常量池中常量个数等于constant_pool_count - 1,用0来表示“不引用任何常量池项目”

常量池主要存放字面量(Literal)和符号引用

字面量:字符串,被声明为final的值等

符号引用:包含以下三类常量

1)类和接口的全限定名

2)字段的名称和描述符

3)方法的名称和描述符

常量池中每一项都是一个表,一共有11中结构不同的数据表,以下是每个表所对应的标志(tag)

标志 类型(CONSTANT_xxx_info) 描述 结构(第一个字节均为对应的tag)
1 Utf8   UTF-8编码的字符串 length(u2) + bytes(length)
3 Integer  整型字面量 bytes(ur)
4 Float   浮点型字面量 bytes(u4)
5 Long   长整型字面量 bytes(u8)
6 Double   双精度浮点型字面量 bytes(u8)
7 Class   类或接口的符号引用 index(u2)
8 String   字符串类型字面量 index(u2)
9 Fieldref   字段的符号引用 index(u2) + index(u2)
10 Methodref 类中方法的符号引用 index(u2) + index(u2)
11 InterfaceMethodref 接口中的符号引用 index(u2) + index(u2)
12 NameAndType 字段或方法的部分符号引用 index(u2) + index(u2)

4.access_flags

5.this_class  super_class

6.interfaces_count  interfaces

7.fields_count  fields

8.methods_count  methods

9.attributes_count  attributes

猜你喜欢

转载自www.cnblogs.com/xiao-ji-xiang/p/9837445.html