Class格式(二)常量池信息

上一篇已经对前面八个字节做了简单的介绍,今天就来说说剩下的一部分。

下面用两个字节来表示常量池个数,后面具体的就是常量池信息。

使用一个字节表示tag,一个集合来表示具体信息。可根据下图来查询具体表示的信息

Class格式(二)常量池信息

还是根据昨天的class文件来做分析,

Class格式(二)常量池信息

001D表示常量池个数,计算一下是29,就是01-28,一共有28个常量,00作为保留位。

下面就是常量池的具体信息了。第一位字节表示tag,根据以上表可以查到

第一个常量表,0A计算一下就是10,对应CONSTANT_Methodref_info,对应两个索引,各占两个字节

0006 #6 000F #10  表示对应了具体位置在第6和第10个常量表位置。

第二个常量表,09计算一下就是9,对应CONSTANT_Fieldref_info,也是对应了两个索引,各占两个字节

0010 #16 0011 #17 表示对应了具体位置在第16和第17个常量表位置。

第三个常量表,08计算一下就是8,对应CONSTANT_String_info,对应了一个索引,占了两个字节,

0012 #18  表示对应了具体第18个常量位置

第四个常量表,0A计算一下也是10,对应CONSTANT_Methodref_info,对应两个索引,各占两个字节

0013 #19 0014 #20  表示对应了具体位置在第19和第20个常量表位置。

第五个常量表,07计算一下就是7,对应CONSTANT_Class_info,也对应了一个索引,占了两个字节

0015 #21 表示对应了具体位置在第21个常量表位置。

第六个常量表,07计算一下也是7,对应CONSTANT_Class_info,也对应了一个索引,占了两个字节

0016 #22 表示对应了具体位置在第21个常量表位置

第七个常量表,01计算一下就是1,对应CONSTANT_Utf8_info,表示一个UTF-8的字符串,两个字节表示字符串的

长度,长度个字节数,00 06表示字符串长度为6,所以后面就有6个字节表示这个字符串,长度为6,所以该字符串就占6个字节,依次读取6个字节,3C 69 6E 69 74 3E转换为十进制为60 105 110 105 116 62,查ASCII表可的出代表的字符分别为,< i n i t >。

已经读到了第七个,一共有28个,这样读是不是很累?开始只是带大家熟悉一下这些关系,其实java有命令可以直接读出来

javap -verbose  class文件

Class格式(二)常量池信息

看一下我们刚才分析的前面的七个常量表,是不是和java自带命令所分析出来的是一样的。这样的话就带大家稍微

看了一下常量池了。有什么不对的麻烦大家指出。

Class格式(二)常量池信息

今天已经分析到这边了。

明天继续分析下面的二级制数据。