虚拟机类文件结构


1、Java虚拟机提供的语言无关性

探索深入理解java虚拟机之虚拟机类文件结构(5)
Java虚拟机不和包括java在内的任何语言绑定,它只与Class文件这种特定的二进制文件格式所关联。不论Class文件来源何种语言,Java虚拟机都能接受。


2、Class类文件的结构

探索深入理解java虚拟机之虚拟机类文件结构(5)

根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储,这种伪结构中只有两种数据类型:无符号数和表,后面的解析都要以这两种数据类型为基础。
无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量值,或者按照UTF-8编码构成字符串值。
表是由多个无符号数或其他表作为数据项构成的符合数据类型,所有表都习惯性地以“_info”结尾。表用于描述有层次关系得符合结构的数据,整个Class文件本质上就是一张表。它由下表所示的数据项构成。


3、魔术与Class文件的版本
每个Class文件的头4个字节称为魔数,它的唯一作用是用于确定这个文件是否为一个能被虚拟机接受的Class文件。
紧接着魔术的4个字节存储的是Class文件的版本号:第5和第6字节是次版本号,第7和第8字节是主版本号。


4、常量池
主次版本号之后的是常量池入口,常量池是Class文件结构中与其它项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时它还是在Class文件中第一个出现得表类型数据项目。
Class文件结构中只有常量池的容量计数是从1开始的,对于其他集合类型,包括接口索引集合、字段表集合、方法表集合等的容量计数都与一般习惯相同,是从0开始的。
常量池之中主要存放两大类常量:字面量和符号引用。


5、访问标志

探索深入理解java虚拟机之虚拟机类文件结构(5)

在常量池结束之后,紧接着的2个字节代表访问标志(access_flags),这个标志用于识别一些类或接口层次的访问信息,包括:这个Class是类还是接口;是否定义为public类型;是否定义为abstract类型;如果是类的话,是否被声明为final,等等。


6、类索引、父类索引与接口索引集合
类索引(this_class)和父类索引(super_class)都是一个u2类型的数据,而接口索引集合是一组u2类型的数据的集合,Class文件中由这三项数据来确定这个类的继承关系。
类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名。类索引、父类索引和接口索引都按顺序排列在访问标志之后,类索引、父类索引用两个u2类型的索引值表示。


7、字段表集合

探索深入理解java虚拟机之虚拟机类文件结构(5)

字段表(field_info)用于描述接口或类中声明的变量。字段包含了类级变量或实例级变量,但不包括在方法内部声明的变量。
字段表集合不会列出从超类或者父类接口继承而来的字段,但有可能列出原本不存在的字段。


8、方法表集合

探索深入理解java虚拟机之虚拟机类文件结构(5)

Class文件存储格式中对方法的描述与对字段的描述几乎采用了完全一致的方式。


9、属性表集合

探索深入理解java虚拟机之虚拟机类文件结构(5)


这些都是概念性的东西,没啥说的,就是讲述了Class文件的结构,想要了解更多,请查阅相关数据。




每天努力一点,每天都在进步。

相关文章:

  • 2021-09-07
  • 2021-08-07
  • 2021-09-28
  • 2022-01-12
  • 2021-06-10
  • 2021-07-29
  • 2019-07-15
猜你喜欢
  • 2021-09-24
  • 2019-06-17
  • 2021-09-14
  • 2021-04-29
  • 2021-12-13
  • 2020-05-19
  • 2020-02-28
相关资源
相似解决方案