JVM----Class类文件结构

时间:2022-06-25 10:11:46

Class文件的结构

Class文件用类似C语言结构体来存储数据,这种伪结构只有2种数据类型:无符号数和表。无符号数属于基本数据类型,以u1,u2,u4,u8分别代表1,2,4,8个字节的无符号数,表由多个无符号数或者其他表作为复合数据类型,习惯以“_info”结尾。
1.魔数: 很多文件存储标准中都采用魔数来进行身份识别,如gif的文件头就存有魔数,使用魔数主要为了安全考虑,因为拓展名可以改变。 Class文件的魔数(0-3字节)是 0xCAFEBABE,占4个字节,知道为什么java的标志是一杯咖啡了吧~~~
2.4-5字节为JDK次版本号,6-7为主版本号。
3.之后紧接的是常量池入口,由于常量池中的常量的数量是不固定的,所以在常量池入口放置一项u2的数据,代表常量池容量的计数值。若值为 0x0016,即十进制22,这就代表常量池中有21项常量,索引值范围1-21。将第0项空出是为了满足后面某些指向常量池的索引值的数据在特定的情况下需要表达“不引用任何一个常量池”的含义,这周情况可用0来表示,且Class文件结构中只有常量池的容量计数是从1开始的。
4.常量池入口后跟着的就是常量池了,常量池中14项常量项的结构总表(Tag为每项都有的标志)。  可以用控制台 javap -verbose XXX来查看 JVM----Class类文件结构

5.常量池结束后紧跟的2个字节代表访问标志,用于识别一些类或者接口的访问信息,包括:这个class是类还是接口,是否为public;是否为abstract等。下图为访问标志。 假若一个public class 公有类,他的标志位的值应为 0x0001 | 0x0020=0x0021 JVM----Class类文件结构
6。访问标志之后是 类索引,父类索引,接口索引。 类索引和父类索引都是一个u2类型的数据,而接口索引集合是一组u2类型的数据的集合,Class文件中由这三项数据来确定这个类的继承关系。类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。类索引和父类索引用两个u2类型的索引值表示,它们各自指向一个类型为CONSTANT_Class_info 的描述符常量,通过CONSTANT_Class_info类型的常量中的索引值可以找到定义在CONSTANT_Utf8_info类型的常量中的全限定名字符串。

7.字段表集合 在之后出现的是一个u2类型的容器计数器fieds_count,若值为0x0001则代表只有一个字段表数据。字段表用于描述接口或者类中声明的变量。字段包括类级变量以及实例级变量,但不包括在方法内部声明的局部变量。字段表的结构如下,name_index代表字段的简单名称,descriptor_index代表字段和方法的描述符,都是对常量池的引用。 JVM----Class类文件结构

描述符:指用来描述字段的数据类型、方法的参数列表(包括数量、类型以及顺序)和返回值

JVM----Class类文件结构

8.方法表
9.属性表
参考资料《深入理解java虚拟机》