查看原文
其他

走进字节码专题--常量池 附录

极客创享会 极客创享会 2019-07-14


常量池 附录

常量池通用格式

1cp_info {
2    u1 tag;
3    u1 info[];
4}

tag 表示常量项类型,整理如下:

常量类型描述
CONSTANT_Class_info7表示类或接口
CONSTANT_Fieldref_info9字段信息表
CONSTANT_Methodref_info10方法
CONSTANT_InterfaceMethodref_info11接口方法
CONSTANT_String_info8java.lang.String 类型的常量对象
CONSTANT_Integer_info3整型字面量
CONSTANT_Float_info4浮点型字面量
CONSTANT_Long_info5长整型字面量
CONSTANT_Double_info6双精度型字面量
CONSTANT_NameAndType_info12名称和类型表
CONSTANT_Utf8_info1utf-8 编码的字符串
CONSTANT_MethodHandle_info15方法句柄表
CONSTANT_MethodType_info16方法类型表
CONSTANT_InvokeDynamic_info18动态方法调用点

对应具体类型分析如下:
1、CONSTANT_Class_info

1功能: 表示类或接口
2格式:
3
4CONSTANT_Class_info {
5    u1 tag;
6    u2 name_index;
7}
8其中:tag 值为7,表示一个 CONSTANT_Class_info 类型
9name_index, 必须是对常量池的一个有效索引。 常量池在该索引处的项必须是CONSTANT_Utf8_info 结构, 代表一个有效的类或接口二进制名称的内部形式。

2、CONSTANT_Fieldref_info

1功能: 表示字段字面量
2格式:
3
4CONSTANT_Fieldref_info {
5    u1 tag;     //9
6    u2 class_index; //CONSTANT_Fieldref_info 结构的 class_index 项的类型既可以是类也可以是接口。
7    u2 name_and_type_index;
8}
9class_index 项的值必须是对常量池的有效索引, 常量池在该索引处的项必须是CONSTANT_Class_info 结构,表示一个类或接口,当前字段或方法是这个类或接口的成员。
10name_and_type_index: 项的值必须是对常量池的有效索引, 常量池在该索引处的项必须是 CONSTANT_NameAndType_info 结构,它表示当前字段或方法的名字和描述符。

方法符号引用 和 接口方法符号引用结构和 字段字面量 类似,如下:
3、CONSTANT_Methodref_info

1功能: 表示方法符号引用
2格式:
3CONSTANT_Methodref_info {
4    u1 tag;   //10
5    u2 class_index; //CONSTANT_Methodref_info 结构的 class_index 项的类型必须是类(不能是接口)。
6    u2 name_and_type_index;
7}

4、CONSTANT_InterfaceMethodref_info

1功能: 表示接口方法符号引用
2格式:
3CONSTANT_InterfaceMethodref_info {
4    u1 tag;    //11
5    u2 class_index; //CONSTANT_InterfaceMethodref_info 结构的class_index 项的类型必须是接口
6(不能是类)。 
7    u2 name_and_type_index;
8}

5、CONSTANT_String_info

1功能: 表示方法符号引用
2格式:
3CONSTANT_String_info {
4    u1 tag;    //8
5    u2 string_index;
6}
7string_index 项的值必须是对常量池的有效索引, 常量池在该索引处的项必须是CONSTANT_Utf8_info 结构,表示一组 Unicode 码点序列,这组 Unicode 码点序列最终会被初始化为一个 String 对象

6、CONSTANT_Integer_info、CONSTANT_Float_info

1功能: 表示表示 4 字节的整型、浮点型字面量
2格式:
3CONSTANT_Integer_info {
4    u1 tag;  //3
5    u4 bytes; 
6}
7CONSTANT_Integer_info 结构的 bytes 项表示 int 常量的值,按照 Big-Endian的顺序存储。
8
9CONSTANT_Float_info {
10    u1 tag;  //4
11    u4 bytes;
12}
13CONSTANT_Float_info 结构的 bytes 项按照 IEEE 754 单精度浮点格式.表示 float 常量的值,按照 Big-Endian 的顺序存储。

7、CONSTANT_Long_info 、CONSTANT_Double_info

1功能:表示 8 字节(long 和 double)的数值常量
21
3    在Class 文件的常量池中,所有的 8 字节的常量都占两个表成员(项)的空间。如果一个 CONSTANT_Long_info 或 CONSTANT_Double_info 结构的项在常量池中的索引为 n,则常量池中下一个有效的项的索引为 n+2, 此时常量池中索引为 n+1 的项有效但必须被认为不可用。
4
5格式:
6CONSTANT_Long_info {
7    u1 tag;   //5
8    u4 high_bytes;
9    u4 low_bytes;
10}
11CONSTANT_Long_info 结构中的无符号的 high_bytes 和 low_bytes 项用于共同表
12示 long 型常量,构造形式为((long) high_bytes << 32) + low_bytes,high_bytes 和 low_bytes 都按照 Big-Endian 顺序存储。
13
14
15CONSTANT_Double_info {
16    u1 tag;   //6
17    u4 high_bytes;
18    u4 low_bytes;
19}
20CONSTANT_Double_info 结构中的 high_bytes 和 low_bytes 共同按照 IEEE 754
21双精度浮点格式 表示 double 常量的值。 high_bytes 和 low_bytes 都按照 Big-Endian 顺序存储。

8、CONSTANT_NameAndType_info

1功能:表示字段或方法(描述其名称和类型)
2格式:
3CONSTANT_NameAndType_info {
4    u1 tag;  //12
5    u2 name_index;
6    u2 descriptor_index;
7}
8
9name_index 项的值必须是对常量池的有效索引, 常量池在该索引处的项必须是CONSTANT_Utf8_info 结构,这个结构要么表示特殊的方法名<init>,要么表示一个有效的字段或方法的非限定名(Unqualified Name)。
10
11descriptor_index 项的值必须是对常量池的有效索引, 常量池在该索引处的项必须是CONSTANT_Utf8_info 结构,这个结构表示一个有效的字段描述符 或方法描述符。

9、CONSTANT_Utf8_info

1功能:表示字段或方法
2格式:
3CONSTANT_Utf8_info {
4    u1 tag;  //1
5    u2 length;
6    u1 bytes[length];
7}
8length 项的值指明了 bytes[]数组的长度(注意,不能等同于当前结构所表示的String 对象的长度), CONSTANT_Utf8_info 结构中的内容是以 length 属性确定长度而不是以 null 作为字符串的终结符。
9如果 length 的值为 0x00, 则没有 bytes[length]。
10
11bytes[]是表示字符串值的byte数组, bytes[]数组中每个成员的byte值都不会是0
12也不在 0xf0 至 0xff 范围内。

10、CONSTANT_MethodHandle_info

1功能:表示方法句柄
2格式:
3CONSTANT_MethodHandle_info {
4    u1 tag;  //15
5    u1 reference_kind;
6    u2 reference_index;
7}
8reference_kind 项的值必须在 1 至 9 之间(包括 1 和 9),它决定了方法句柄的类型。方法句柄类型的值表示方法句柄的字节码行为。

11、CONSTANT_MethodType_info

1功能:表示方法类型
2格式:
3CONSTANT_MethodType_info {
4    u1 tag;   //16
5    u2 descriptor_index;
6}
7descriptor_index 项的值必须是对常量池的有效索引, 常量池在该索引处的项必须是CONSTANT_Utf8_info 结构,表示方法的描述符。

12、CONSTANT_InvokeDynamic_info

1功能:表示方法类型
2格式:
3CONSTANT_InvokeDynamic_info {
4    u1 tag;  //18
5    u2 bootstrap_method_attr_index;
6    u2 name_and_type_index;
7}
8
9bootstrap_method_attr_index  项的值必须是对当前 Class 文件中引导方法表的 bootstrap_methods[]数组的有效索引。
10
11name_and_type_index  项的值必须是对当前常量池的有效索引, 常量池在该索引处的项必须是 CONSTANT_NameAndType_info 结构,表示方法名和方法描述。
12




END

喜欢随手转发点赞^_^


极客创享会
干货分享、结识更多极客


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存