一步一步学JVM

时间:2021-12-26 10:35:42

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文件、字段表、方法表中都可以携带自己的属性表集合,用于描述某些场景专有的信息。