一步一步学JVM-Class文件
Class类文件的结构
Class文件是一组以8字节为基础单位的二进制流。当遇到需要占用8字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8位字节进行存储。
根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中有两种数据类型:无符号书和表。
无符号数属于基本的数据类型,用来描述数字、索引引用、数据值或者按照UTF-8编码构成字符串值。
表是由多个无符号数或者其他表作为数据项构成的符合数据类型。
魔数与Class文件的版本
每个Class文件的4个字节成为魔数,它的唯一作用是确定这个文件是否为一个能被虚拟机接收的class文件。
紧接着魔数的4个字节存储的是Class文件的版本号:第5和第6字节是次版本号,第7好第8字节是主版本号。
常量池
紧接着主次版本号之后的是常量池入口,常量池可以理解为Class文件之中的资源仓库,它是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件最大的数据项目之一。
常量池中主要存放两大类常量:字面量和符号引用。字面量比较接近与Java语言层面的常量概念,如文本字符串、声明为final的常量值等。
而符号引用包含了下面三个常量
1、 类和接口的全限命名
2、 字段的名称和描述符
3、 方法的名称和描述符
访问标志
在常量池结束后,紧接着两个字节表示访问标志,这个标志用于识别一些类或者接口层次的访问信息,比如这个Class是类还是接口;是否定义为public类型,是否为abstract类型,如果是类的话,是否被声明为final累心等。
类索引、父类索引与接口索引集合
Class文件由这三项数据类确定这个类的继承关系。
1、类索引用于确定这个类的全限命名。
2、父类索引用于确定这个类的父类的全限命名。
3、接口索引集合就用来描述这个类实现了哪些接口
字段表集合
字段表用于描述接口或者类中声明的变量。字段包括类级变量以及实例级变量,但不包括在方法内部声明的局部变量。
方法表集合
方法表的结构如同字段表一样,依次包括了访问标志、名称索引、描述符索引、属性表集合几项。
属性表集合
在Class文件、字段表、方法表中都可以携带自己的属性表集合,用于描述某些场景专有的信息。