字节码文件(.class)的格式固定如下
因为觉得这几张表后面的学习可能会用到,所以在https://www.cnblogs.com/paddix/p/5282004.html盗窃了这几张图,留作备份。
目录
因为觉得这几张表后面的学习可能会用到,所以在https://www.cnblogs.com/paddix/p/5282004.html盗窃了这几张图,留作备份。
以下数字均表示相应组成部分占据字节大小,如4magic代表文件格式这个参数在生成的字节码文件里占据4个字节
以下数字均表示相应组成部分占据字节大小,如4magic代表文件格式这个参数在生成的字节码文件里占据4个字节
4magic+2minor_version+2major_version+2constant_pool_count+constant_pool[-1]
+2access_flags+2this_class+2super_class+2interfaces_count+2interfaces[]+
2fiellds_count+fields[]+2methods_count+methods[]+2attributes_count+attributes[]
共需要1+5张表来说明这5个数组和常量池
以下是一个空白的JAVA文件对应的字节码文件里的信息
2.常量池的数据类型是表,它的类型包括以下14种
3.每种常量类型对应的表结构如下:(共14种)
常量 | 项目 | 类型 | 描述 |
CONSTANT_Utf8_info | tag | u1 | 1 |
length | u2 | 字节数 | |
bytes | u1 | utf-8编码的字符串 | |
CONSTANT_Integer_info | tag | u1 | 3 |
bytes | u4 | int值 | |
CONSTANT_Float_info | tag | u4 | 4 |
bytes | u1 | float值 | |
CONSTANT_Long_info | tag | u1 | 5 |
bytes | u8 | long值 | |
CONSTANT_Double_info | tag | u1 | 6 |
bytes | u8 | double值 | |
CONSTANT_Class_info | tag | u1 | 7 |
index | u2 | 指向全限定名常量项的索引 | |
CONSTANT_String_info | tag | u1 | 8 |
index | u2 | 指向字符串常量的索引 | |
CONSTANT_Fieldref_info | tag | u1 | 9 |
index | u2 | 指向声明字段的类或接口描述符CONSTANT_Class_info的索引值 | |
index | u2 | 指向CONSTANT_NameAndType_info的索引值 | |
CONSTANT_Methodref_info | tag | u1 | 10 |
index | u2 | 指向声明方法的类描述符CONSTANT_Class_info的索引值 | |
index | u2 | 指向CONSTANT_NameAndType_info的索引值 | |
CONSTANT_InterfaceMethodref_info | tag | u1 | 11 |
index | u2 | 指向声明方法的接口描述符CONSTANT_Class_info的索引值 | |
index | u2 | 指向CONSTANT_NameAndType_info的索引值 | |
CONSTANT_NameAndType_info | tag | u1 | 12 |
index | u2 | 指向该字段或方法名称常量的索引值 | |
index | u2 | 指向该字段或方法描述符常量的索引值 | |
CONSTANT_MethodHandle_info | tag | u1 | 15 |
reference_kind | u1 | 值必须1~9,它决定了方法句柄的的类型 | |
reference_index | u2 | 对常量池的索引 | |
CONSTANT_MethodType_info | tag | u1 | 16 |
description_index | u2 | 对常量池中方法描述符的索引 | |
CONSTANT_InvokeDynamic_info | tag | u1 | 18 |
bootstap_method_attr_index | u2 | 对引导方法表的索引 | |
name_and_type_index | u2 | 对CONSTANT_NameAndType_info的索引 |
4.访问标识符规定
5.方法表的结构如下:(领域表和接口表这里没有介绍)
Type | Descriptor |
u2 | access_flag |
u2 | name_index |
u2 | descriptor_index |
u2 | attributes_count |
attribute_info | attribute_info[attributes_count] |
6.属性表如下:
Type | Descriptor |
u2 | attribute_name_index |
u4 | attribute_length |
u1 | bytes |