深入Java虚拟机一:类文件结构

这个系列的博客大多是阅读《深入理解Java虚拟机》后整理而来,是本好书值得读好多遍。

0x00 写在前面:

1.先引用一下书中的话:

Class文件各个数据项目严格按照顺序紧凑地排列着,中间没有添加任何分隔符

因为Class文件要保持经凑,在一些不定长的数据结构中就经常会出现如下结构

数据长度length 数据data

其中length表示了紧随其后的data所占字节数。

2.constant_pool是一个挺重要的结构了,因为好多其他部分都引用了资源池中的数据。另外一个重要的结构attribute_info在后面一节画上吧

0x01 整体结构

我按照Class文件的结构顺序的画了下思维导图如下(即图中从上到下的顺序也就是class文件内部结构的顺序),该说的东西也都在里面了:
在这里插入图片描述

0x02属性

属性表(attributes)由0或多个attribute_info组成,在字段表、方法表、class中均可能会存在attribute_info信息。整体归纳总结如下图,图中的也只是一部分属性,(图中各项属性只是列举的关系):
在这里插入图片描述
注:

  1. Code属性中的code_lengths和code是用来存储Java源程序编译后生成的字节码指令,其中code保存的是字节码指令和指令所需要的参数,每个字节码指令大小固定占1字节,其参数根据不同指令占用不同的大小空间,一条指令所需参数占用空间大小是固定的。(1字节可以表示256条指令,目前Java已经定义了200多条指令)比如invokespecial = 183 (0xb7)指令,他需要两个字节的参数,紧随其后。具体格式可以参考官方文档
  2. ConstantValue属性是字段表中的一个属性,因此该属性中只保存了一个Constantvalue_index(Constantvalue_index是指向常量池中一个字面常量的引用,就是对应字段的值)

参考:https://blog.csdn.net/wzq6578702/article/details/81415905

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章