常量项的类型和tag取值
tag值 | 常量项类型 | 含义 |
---|---|---|
1 | CONSTANT_Utf8 | 用于存储字符串的常量项。该项真正包含了字符串内容。而 CONSTANT_String 常量项只存储了一个指向 CONSTANT_Utf8 项的索引。 |
2 | ||
3 | CONSTANT_Integer | Java中,int 和 float 型数据的长度都是4个字节。这两种常量分别代表 int 和 float 型数据信息。 |
4 | CONSTANT_Float | |
5 | CONSTANT_Long | Java中, long 和 double 型数据的长度都是8个字节。这两种常量分别代表 long 以及 double 型数据信息。 |
6 | CONSTANT_Double | |
7 | CONSTANT_Class | 代表类或接口的信息。 |
8 | CONSTANT_String | 代表一个字符串(String)。该常量本身不存储字符串的内容,它只是存储了一个索引值。 |
9 | CONSTANT_Fieldref | 存储成员变量的信息。信息包括所属类的类名、变量、函数名、函数参数、返回值等。 |
10 | CONSTANT_Methodref | 存储成员函数的信息。信息包括所属类的类名、变量、函数名、函数参数、返回值等。 |
11 | CONSTANT_InterfaceMethodref | 存储接口函数的信息。信息包括所属类的类名、变量、函数名、函数参数、返回值等。 |
12 | CONSTANT_NameAndType | 这种类型的常量项用于描述类的成员域或成员函数相关的信息。 |
13 | ||
14 | ||
15 | CONSTANT_MethodHandle | 用于描述 MethodHandle 信息。MethodHandle 和反射有关系。Java类库中对应的类为 java.lang.invoke.MethodHandle 。 |
16 | CONSTANT_MethodType | 用于描述一个成员函数的信息。只包括函数的 参数类型 和 返回值 ,不包括函数名和所属类的类名。 |
17 | ||
18 | CONSTANT_InvokeDynamic | 用于 invokeDynamic 指令。invokeDynamic 和 Java 平台上实现了一些动态语言(如Python)相类似的有关功能。 |
常见的常量项内容
常量项名称 | 数据结构 | 说明 | |
---|---|---|---|
大小 | 名称 | ||
CONSTANT_Utf8_info | u1 | tag | |
u2 | length | ||
u1 | bytes[ length ] | ||
CONSTANT_Class_info | u1 | tag | |
u2 | name_index | 指向 CONSTANT_Utf8_info | |
CONSTANT_Fieldref_info | u1 | tag | |
u2 | class_index | ||
u2 | name_and_type_index | ||
CONSTANT_String_info | u1 | tag | |
u2 | string_index | 指向 CONSTANT_Utf8_info | |
CONSTANT_MethodType_info | u1 | tag | |
u2 | descriptor_index | 指向 CONSTANT_Utf8_info | |
CONSTANT_Methodref_info | u1 | tag | |
u2 | class_index | ||
u2 | name_and_type_index | ||
CONSTANT_NameAndType_info | u1 | tag | |
u2 | name_index | 指向 CONSTANT_Utf8_info | |
u2 | descriptor_index | 指向 CONSTANT_Utf8_info | |
CONSTANT_InterfaceMethodref_info | u1 | tag | |
u2 | class_index | ||
u2 | name_and_type_index | ||
CONSTANT_Long_info | u1 | tag | |
u4 | high_bytes | ||
u4 | low_bypes | ||
CONSTANT_Integer_info | u1 | tag | |
u4 | bytes | ||
CONSTANT_Double_info | u1 | tag | |
u4 | high_bytes | ||
u4 | low_bypes | ||
CONSTANT_Float_info | u1 | tag | |
u4 | bytes |
信息描述规则
- 数据类型的描述规则(基本数据类型 和 引用类型)。
- 成员变量的描述规则(Field Descriptor)。
- 成员函数的描述规则(Method Descriptor)。
数据类型描述规则
数据类型对照表 | |
---|---|
数据类型 | 类型描述符 |
byte | B |
char | C |
double | D |
float | F |
int | I |
short | S |
long | **J **(引用类型已用L) |
boolean | Z (byte类型已用B) |
引用类型 | LClassName;如:Ljava/lang/String; |
数组 | [ 其他数据类型描述符 |
成员变量描述规则
与数据类型描述规则相同。BaseType | ObjectType | ArrayType
成员函数描述规则
( ParameterDescriptor )ReturnDescriptorParameterDescriptor :FieldTypeReturnDescriptor:FieldType | VoidDescriptor ( V 代表 Void )