class类文件结构

终于把一遍class结构翻译完了,感觉像破译密码一样,身心疲惫,怕忘了所以mark一下。

cafe babe 魔数 代表class 文件
0000 次版本号
0031 主版本号 十六进制31转换为十进制是49
0016 常量池容量值 十六进制16转换为 10进制是 22,代表常量池中有21个常量(1-21),
07 第一个常量(CONSTANT_Class_info)
0002 (name_index)
01 第二位常量的标志位
0010 (10的length是十进制的16)
63 6e 2f 67 6c 73 2f 54 65 73 74 43 6c 61 73 73
cn/gls/TestClass
07 第三位常量的标志位
0004 (name_index)
01 第四位常量的标志位
0010 (10的length是十进制的16)
6a 61 76 61 2f 6c 61 6e 67 2f 4f 62 6a 65 63 74
java/lang/Object
01 第五位常量的标志位
0001 (1的length是十进制的1)
6d m
01 第六位常量的标志位
0001 (1的length是十进制的1)
49 I
01 第七位常量的标志位
0006 (06的length是十进制的6)
3c 69 6e 69 74 3e
<init>
01 第八位常量的标志位
0003 (03的length是十进制的3)
28 29 56
()V
01 第九位常量的标志位
0004 (04的length是十进制的3)
43 6f 64 65
Code
0a 第十位常量的标志位 (换算成十进制为10,10代表CONSTANT_Methodref_info)
00 03 指向常量池中索引值为3的常量CONSTANT_Class_info
00 0b 指向常量池中索引值为11的CONSTANT_NameAndType_info
0c 第十一位常量的标志位 (换算成十进制为12,12代表CONSTANT_NameAndType_info)
0007 指向常量池中索引值为7的方法名或常量项的索引
0008 指向常量池中索引值为8的方法描述符或常量项的索引
01 第十二位常量的标志位
00 0f (0f的length是十进制的15)
4c 69 6e 65 4e 75 6d 62 65 72 54 61 62 6c 65
LineNumberTable
01 第十三位常量的标志位
00 12 (12的length是十进制的18)
4c 6f 63 61 6c 56 61 72 69 61 62 6c 65 54 61 62 6c 65
LocalVariableTable
01 第十四位常量的标志位
0004 (04的length是十进制的4)
74 68 69 73
this
01 第十五位常量的标志位
00 12 (12的length是十进制的18)
4c 63 6e 2f 67 6c 73 2f 54 65 73 74 43 6c 61 73 73 3b
Lcn/gls/TestClass;
01 第十六位常量的标志位
00 03 (3的length是十进制的3)
69 6e 63
inc
01 第十七位常量的标志位
00 03
28 29 49
()I
09 第十八位常量的标志位(CONSTANT_Fieldref_inf)
00 01 指向常量池中索引值为1的CONSTANT_Class_info索引项 cn/gls/TestClass
00 13 指向常量池中索引值为13的CONSTANT_NameAndType_info索引项
0c 第十九位常量的标志位(0c转换成10进制是12) CONSTANT_NameAndType_info
00 05 指向常量池中索引值为5的字段或方法名的索引项 m
00 06 指向常量池中索引值为5的字段或方法描述的索引项 I
01 第二十位常量的标志位
00 0a(0a转换成十进制是10)
53 6f 75 72 63 65 46 69 6c 65
SourceFile
01 第二十一位常量的标志位
00 0e(0e转换成10进制是14)
54 65 73 74 43 6c 61 73 73 2e 6a 61 76 61
TestClass.java
00 21 访问标志
00 01 类索引 指向常量池中索引值为1的索引项 cn/gls/TestClass
00 03 父类索引 指向常量池中索引值为3的索引项 java/lang/Object
00 00 接口索引集合 如果该类没有任何接口,则该计数器为0
00 01 字段访问标志,说明该类只有一个字段表数据
00 02 代表private
00 05 指向常量池中索引值为5的索引项 m
00 06 指向常量池中索引值为6的索引项 I
00 00 代表属性为0
00 02 方法集合 代表集合中有2个方法(编译器添加的实例构造器<init>和源码中的方法)
00 01 第一个方法的访问标志 ACC_PUBLIC
00 07 名称索引值 指向常量池中索引值为7的索引项 <init>
00 08 描述符 指向常量池中索引值为8的索引项 ()V
00 01 属性计数器 代表该属性表集合有一个属性
00 09 属性名称 指向常量池中索引值为9的索引项Code

00 00 00 2f attribute_length : 47 表示接下来还有47个字节来描述该属性内容
00 01 max_stack : 1
00 01 max_locals : 1
00 00 00 05 : code_length 5 ,(表示接下来还有5个字节来存储字节码指令)
2a b7 00 0a b1 :5个字节的字节码指令
(2a对应的指令为aload_0,这个指令的含义是将第0个slot中为reference类型的本地变量推送到操作数栈顶)
(b7对应的指令是invokespecial)
(00 0a 代表invokespecial的参数,对应的常量实例为实例构造器<init>方法的符号引用)
(b1 对应的指令是return,含义是返回此方法,并且返回值为void)
00 00 : 0表示没有异常抛出
00 02 : attribute_count ,2 表示 Code属性表里还有2个属性
00 0c : 0c代表12,指向常量池中索引为12的选项 LineNumberTable
00 00 00 06 :长度为6
00 01 : line_number_table_length 1
00 00: 字节码 行号 0
00 03: java源码行号 3
00 0d: 13 指向常量池中索引为13的选项 LocalVariableTable
00 00 00 0c : length 12
00 01: local_variable_table_length 1
00 00 : 局部变量的生命周期开始的字节码偏移量 0
00 05 : 局部变量作用范围覆盖的长度 5
00 0e : 14 指向常量池中CONSTANT_Utf8_info类型常量的索引,局部变量名称 this
00 0f : 15 指向常量池中CONSTANT_Utf8_info类型常量的索引,局部变量描述符 Lcn/gls/TestClass;
00 00 : 0 局部变量在栈帧局部变量表中Slot的位置,如果这个变量的数据类型为64位类型(long或double),它占用的Slot为index和index+1这2个位置
00 01 : 第二个方法 的访问标志 ACC_PUBLIC
00 10 : 转变成10进制 是 16,名称索引值 指向常量池中索引值为16的索引项inc
00 11 : 转变成10进制 是 17,名称索引值 指向常量池中索引值为17的索引项()I
00 01 :属性计数器 代表该属性表集合有一个属性
00 09 :属性名称 指向常量池中索引值为9的索引项Code
00 00 00 31 :attribute_length : 49 表示接下来还有49个字节来描述该属性内容
00 02 :max_stack : 1
00 01 : max_locals : 1
00 00 00 07 : code_length 7 ,(表示接下来还有7个字节来存储字节码指令)
2a b4 00 12 04 60 ac
(2a对应的指令为aload_0,这个指令的含义是将第0个slot中为reference类型的本地变量推送到操作数栈顶)
b4 getfield 是指获取指定类的实例,并将其值压入栈顶
00 12 换成10进制是18 对应的常量池中索引为18的选项
04 iconst_1 将int型1推送至栈顶
60 iadd 将栈顶两int型数值相加并将结果压入栈顶
ac ireturn 从当前方法返回int
00 00 : 表示没有抛出异常
00 02 :attribute_count ,2 表示 Code属性表里还有2个属性
00 0c:0c代表12,指向常量池中索引为12的选项 LineNumberTable
00 00 00 06 :长度为6
00 01 :line_number_table_length 1
00 00 :字节码 行号 0
00 08 : java源码行号 8
00 0d :13 指向常量池中索引为13的选项 LocalVariableTable
00 00 00 0c : length 12
00 01 :local_variable_table_length 1
00 00 :局部变量的生命周期开始的字节码偏移量 0
00 07 :局部变量作用范围覆盖的长度 5
00 0e :14 指向常量池中CONSTANT_Utf8_info类型常量的索引,局部变量名称 this
00 0f :15 指向常量池中CONSTANT_Utf8_info类型常量的索引,局部变量描述符 Lcn/gls/TestClass;
00 00 :0 局部变量在栈帧局部变量表中Slot的位置,如果这个变量的数据类型为64位类型(long或double),它占用的Slot为index和index+1这2个位置
00 01 : sourceFile ,说明有一个类属性
00 14 : 20 指向常量池中第20个常量:SourceFile
00 00 00 02 :说明属性体长度为2字节
00 15 :21 指向常量池中第21个常量 TestClass.java ,即这个Class文件的源码文件名为TestClass.java

https://baike.baidu.com/item/ASCII/309296?fr=aladdin#reference-[1]-15482-wrap  翻译工具

原文地址:https://www.cnblogs.com/guolsblog/p/10795997.html