之前说到在常量池的表项数量之后就是常量池的实际内容,每一项以类型,长度,内容的顺序依次排列。下面介绍一下常量池表项的类型:
常量池中数据项类型 | 类型标志 |
---|---|
CONSTANT_Utf8 | 1 |
CONSTANT_Integer | 3 |
CONSTANT_Float | 4 |
CONSTANT_Long | 5 |
CONSTANT_Double | 6 |
CONSTANT_Class | 7 |
CONSTANT_String | 8 |
CONSTANT_Fieldref | 9 |
CONSTANT_Methodref | 10 |
CONSTANT_InterfaceMethodref | 11 |
CONSTANT_NameAndType | 12 |
根据这些常量池类型大体就知道代表着什么意思,这里就不再赘述了。
CONSTANT_Utf8的格式定义如下:
CONSTANT_Utf8_info{
u1 tag;
u2 length;
u1 bytes[length];
}
tag代表着类型标志,根据上表可知这里的tag=1,length是字符串长度,再后来就是字符串的内容。
如图所示,从第一行的0D列开始的是常量池中第二个表项,01代表它是一个UTF8的常量,0033代表该常量一共有51个字节,再往后数51个字节就是该常量的实际内容。第一行的0A到0D中的07代表着它是一个CONSTANT_Class常量,0002代表着它由常量池中第二个常量字符串指定。每个字节代表什么含义是由常量池类型规定的格式决定的,比如刚刚提到的这个CONSTANT_Class,它的格式(或说是结构)如下:
CONSTANT_Class_info{
u1 tag;//无符号单字节的标记位,这里的值是07
u2 name_index;//常量池的索引,即上文中的0002
}
其余的类型以此类推,可以通过书籍资料等自行分析。
Class的访问标记
访问标记位于常量池后,使用两个字节表示,表示该类的访问信息,如public,final等。下面是类Access Flag标记位和含义: