JVM——Class文件

class文件的整体格式

类型 名称 数量
u4 magic 1
u2 minor_version 1
u2 major_version 1
u2 constant_pool_count 1
cp_info constant_pool constant_pool_count - 1
u2 access_flags 1
u2 this_class 1
u2 super_class 1
u2 interfaces_count 1
u2 interfaces interfaces_count
u2 fields_count 1
field_info fields fields_count
u2 methods_count 1
method_info methods methods_count
u2 attribute_count 1
attribute_info attributes attributes_count

常量池的项目类型

类 型 标 志 描 述
CONSTANT_Utf8_info 1 UTF-8编码的字符串
CONSTANT_Integer_info 3 整型字面量
CONSTANT_Float_info 4 浮点型字面量
CONSTANT_Long_info 5 长整形字面量
CONSTANT_Double_info 6 双精度浮点型字面量
CONSTANT_Class_info 7 类或接口的符号引用
CONSTANT_String_info 8 字符串类型字面量
CONSTANT_Fieldref_info 9 字段的符号引用
CONSTANT_Methodref_info 10 方法的符号引用
CONSTANT_InterfaceMethodref_info 11 接口的方法符号引用
CONSTANT_NameAndType_info 12 字段或方法的部分符号引用
CONSTANT_MethodHandle_info 15 表示方法句柄
CONSTANT_MethodType_info 16 标识方法类型
CONSTANT_InvokeDynamic_info 18 表示一个动态方法调用点

常量池的各项目类型结构

CONSTANT_Class_info 结构用于表示类或接口,格式如下:

CONSTANT_Class_info {
    u1 tag;
    u2 name_index;
}

CONSTANT_Fieldref_info, CONSTANT_Methodref_info 和CONSTANT_InterfaceMethodref_info

字段,方法和接口方法由类似的结构表示:

字段:

CONSTANT_Fieldref_info {
    u1 tag;
    u2 class_index;
    u2 name_and_type_index;
}

方法:

CONSTANT_Methodref_info {
    u1 tag;
    u2 class_index;
    u2 name_and_type_index;
}

接口方法:

CONSTANT_InterfaceMethodref_info {
    u1 tag;
    u2 class_index;
    u2 name_and_type_index;
}

CONSTANT_String_info 用于表示java.lang.String 类型的常量对象,格式如下:

CONSTANT_String_info {
    u1 tag;
    u2 string_index;
}

CONSTANT_Intrger_info 和CONSTANT_Float_info 结构表示4 字节(int 和float)的数值常量:

CONSTANT_Integer_info {
    u1 tag;
    u4 bytes;
}
 
CONSTANT_Float_info {
    u1 tag;
    u4 bytes;
}

CONSTANT_Long_info 和CONSTANT_Double_info 结构表示8 字节(long 和double)的数值常量:

CONSTANT_Long_info {
    u1 tag;
    u4 high_bytes;
    u4 low_bytes;
}
 
CONSTANT_Double_info {
    u1 tag;
    u4 high_bytes;
    u4 low_bytes;
}

CONSTANT_NameAndType_info 结构用于表示字段或方法,但是和字段、方法、接口方法结构不同,CONSTANT_NameAndType_info 结构没有标识出它所属的类或接口,格式如下:

CONSTANT_NameAndType_info {
    u1 tag;
    u2 name_index;
    u2 descriptor_index;
}

CONSTANT_Utf8_info 结构用于表示字符串常量的值: 

CONSTANT_Utf8_info {
    u1 tag;
    u2 length;
    u1 bytes[length];
}

CONSTANT_MethodHandle_info 结构用于表示方法句柄,结构如下:

{
    u1 tag;
    u1 reference_kind;
    u2 reference_index;
}

其中,tag 项的值为CONSTANT_MethodHandle(15)。reference_kind 项的值必须在1 至9 之间(包括1 和9),它决定了方法句柄的类型。reference_index 项的值必须是对常量池的有效索引。

CONSTANT_MethodType_info 结构用于表示方法类型:

CONSTANT_MethodType_info {
    u1 tag;
    u2 descriptor_index;
}

CONSTANT_InvokeDynamic_info 用于表示invokedynamic 指令所使用到的引导方法(Bootstrap Method)、引导方法使用到动态调用名称(Dynamic Invocation Name)、参数和请求返回类型、以及可以选择性的附加被称为静态参数(Static Arguments)的常量序列。

CONSTANT_InvokeDynamic_info {
    u1 tag;
    u2 bootstrap_method_attr_index;
    u2 name_and_type_index;
}

 

posted @ 2020-08-29 20:02  手握钢叉的猹  阅读(202)  评论(0编辑  收藏  举报