虚拟机Class类的文件结构

Class类文件结构

任何一个Class文件都对应着唯一的一个类或一个接口的定义信息,但是类或接口并不一定都要定义在文件里(动态生成)。
Class文件是一组以8个字节为基础单位的二进制流,Class文件采用类似于C语言结构体的伪结构体来存储数据,这种结构体只有两种数据类型:“无符号数”和“表”。
无符号数:以u1,u2,u4,u8来分别代表1个字节,2个字节,4个字节,8个字节的无符号数,无符号数可以用来描述数字,索引引用,数量值或者按照UTF-8编码的字符串。
:表是由多个无符号数或者其他表作为数据项构成的复合数据类型,表的命名为以“_info”结尾。整个Class文件本质也可以视作一张表。

Magic Number

每个Class文件的头4个字节称为魔数,唯一作用确定这个文件是否为一个能被虚拟机接收的Class文件(身份辨别),它的值为0xCAFEBABE。

版本号

5,6字节为次版本号(Minor Version),6,7字节为主版本号(Major Version)。

常量池

接下来的两个字节为常量池计数值(constant_pool_count),用来存储常量池中常量的数量(从1开始计算),接着是常量池入口,它是Class文件中第一个出现的表结构。
常量池中主要存放两大类常量:字面量和符号引用。
字面量:文本字符串,被声明为final的常量值等。
符号引用

  • 被模块导出或者开放的包
  • 类和接口的全限定名
  • 字段的名称和描述符
  • 方法句柄和方法类型
  • 动态调用点和动态常量
    在虚拟机进行类加载时,将会从常量池获得对应的符号引用,再在类创建时或运行时解析翻译到具体的内存地址中。
    常量池中每一项常量都是一个表,截止至JDK13一共有17种不同类型的常量。17类表都有一个共同点,表的结构起始的第一个位是个u1类型的标志位(tag)表示当前的常量是属于那种类型。

访问标志

访问标志(access_flags)占两个字节,用于识别一些类或者接口层次的访问信息,包括这个Class是类还是接口,是否为public类型,是否为Abstract类型

类索引,父类索引与接口索引集合

类索引(this.class),父类索引(super_class)都占两个字节,接口索引集合是一组u2类型的数据集合。
类索引用于用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名,接口索引集合用来描述这个类实现了哪些接口,这些被实现的接口按implements关键字后的接口顺序从左至右排列在接口索引集合中。

字段表集合

字段表集合(field_info)用于描述接口或者类中声明的变量。

猜你喜欢

转载自blog.csdn.net/weixin_43663421/article/details/109341261