class file解析一

来源:互联网 发布:c语言字符串字符个数 编辑:程序博客网 时间:2024/05/22 08:21

文字说明:简单

目的:学习记录

是否有手续:是


CONSTANT_Class_info

CONSTANT_NameAndType_info
CONSTANT_Utf8_info


ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}


Table 4.4-A. Constant pool tags
Constant Type Value
CONSTANT_Class 7
CONSTANT_Fieldref 9
CONSTANT_Methodref 10
CONSTANT_InterfaceMethodref 11
CONSTANT_String 8
CONSTANT_Integer 3
CONSTANT_Float 4
CONSTANT_Long 5
CONSTANT_Double 6
CONSTANT_NameAndType 12
CONSTANT_Utf8 1
CONSTANT_MethodHandle 15
CONSTANT_MethodType 16
CONSTANT_InvokeDynamic 18


//cp_info是通用格式,CONSTANT_Class_info,CONSTANT_Fieldref_info等等都属于cp_info的具体表示格式
cp_info {
u1 tag;//常量池入口种类
u1 info[];
}


//类
CONSTANT_Class_info {
u1 tag;//CONSTANT_Class (7).
u2 name_index;//引用常量池中的另一个入口:CONSTANT_Utf8_info
}
//字符串
CONSTANT_Utf8_info {
u1 tag;
u2 length;
u1 bytes[length];
}
//类变量或成员变量,或者接口的成员变量
CONSTANT_Fieldref_info {
u1 tag;//CONSTANT_Fieldref (9).
u2 class_index;//引用常量池中的另一个入口:CONSTANT_Class_info
u2 name_and_type_index;//引用常量池中的另一个入口:CONSTANT_NameAndType_info
}
//类方法或成员方法
CONSTANT_Methodref_info {
u1 tag;//CONSTANT_Methodref (10).
u2 class_index;//引用常量池中的另一个入口:CONSTANT_Class_info
u2 name_and_type_index;//引用常量池中的另一个入口:CONSTANT_NameAndType_info
}
//接口的方法
CONSTANT_InterfaceMethodref_info {
u1 tag;//CONSTANT_InterfaceMethodref (11).
u2 class_index;//引用常量池中的另一个入口:CONSTANT_Class_info
u2 name_and_type_index;//引用常量池中的另一个入口:CONSTANT_NameAndType_info
}


CONSTANT_String_info {
u1 tag;//CONSTANT_String (8).
u2 string_index;//引用常量池中的另一个入口:CONSTANT_Utf8_info
}


CONSTANT_Integer_info {
u1 tag;//CONSTANT_Integer (3).
u4 bytes;
}
CONSTANT_Float_info {
u1 tag;//CONSTANT_Float (4).
u4 bytes;
}


CONSTANT_Long_info {
u1 tag;//CONSTANT_Long (5).
u4 high_bytes;
u4 low_bytes;
}
CONSTANT_Double_info {
u1 tag;//CONSTANT_Double (6).
u4 high_bytes;
u4 low_bytes;
}


//该格式本身可以代表field或者method,但是当具体引用该结构时,它可能就代表具体的field或者method。
CONSTANT_NameAndType_info {
u1 tag;//CONSTANT_NameAndType (12).
u2 name_index;//引用常量池中的另一个入口:CONSTANT_Utf8_info
u2 descriptor_index;//引用常量池中的另一个入口:CONSTANT_Utf8_info,representing a valid field descriptor or method descriptor
}


CONSTANT_MethodHandle_info {
u1 tag;//CONSTANT_MethodHandle (15).
u1 reference_kind;
//reference_kind in (1,2,3,4):CONSTANT_Fieldref_info;
//reference_kind in (5,8):CONSTANT_Methodref_info;
//reference_kind in (6,7):CONSTANT_Methodref_info or CONSTANT_InterfaceMethodref_info;
//reference_kind in (9):CONSTANT_InterfaceMethodref_info;
u2 reference_index;
}


CONSTANT_MethodType_info {
u1 tag;//CONSTANT_MethodType (16).
u2 descriptor_index;//引用常量池中的另一个入口:CONSTANT_Utf8_info,representing a method descriptor
}


CONSTANT_InvokeDynamic_info {
u1 tag;//CONSTANT_InvokeDynamic (18).
u2 bootstrap_method_attr_index;
u2 name_and_type_index;//引用常量池中的另一个入口:CONSTANT_NameAndType_info,representing a method name and method descriptor
}


field_info


method_info


attribute_info
0 0
原创粉丝点击