Class格式(二)常量池信息
上一篇已经对前面八个字节做了简单的介绍,今天就来说说剩下的一部分。
下面用两个字节来表示常量池个数,后面具体的就是常量池信息。
使用一个字节表示tag,一个集合来表示具体信息。可根据下图来查询具体表示的信息
还是根据昨天的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文件
看一下我们刚才分析的前面的七个常量表,是不是和java自带命令所分析出来的是一样的。这样的话就带大家稍微
看了一下常量池了。有什么不对的麻烦大家指出。
今天已经分析到这边了。
明天继续分析下面的二级制数据。