作者:吉祥话如意 | 来源:互联网 | 2023-09-23 13:20
【0】README0.1)本文总结于Clas字节码文件,旨在理清Class字节码文件的大体结构;【1】干货开始对上图的分析(Analysis):A1)offset0A1.1)头四个字节为CAFE
【0】README
0.1)本文总结于 Clas字节码文件,旨在理清 Class字节码文件的大体结构;
【1】干货开始
对上图的分析(Analysis):
A1)offset=0
- A1.1)头四个字节为CAFEBABE:表示魔数;
- A1.2)第5、6个字节是0x0:表示Class文件的次版本号;
- A1.3)第7、8个字节是0x34:表示主版本号;
- A1.4)第9、10个字节是0x13=19:表示常量池中常量个数,不过编号0不使用,故实际上只有18个常量;
- A1.5)第11~15个字节是(0x0A 0x04 0x0F):分别表示常量池中常量标志(类型标志),查表6-3知,其类型是 CONSTANT_Methodred_info,且查表6-6知,后面是index=0x04(2个字节)和index=0x0F(2个字节),前者指向声明方法的类描述符 CONTSTANT_Class_info的索引项(#4),查表6-4知,CONTSTANT_Class_info=(tag,name_index);后者指向名称及类型描述符CONSTANT_NameAndType 索引项(#15),继续查表;
- A1.6)第16个字节=0x09,又是常量标志,查表6-3知,表示 CONSTANT_Fieldref_info(字段的符号引用),继续查表。。。这样的常量有18个,我们到了0xB0行;
A2)offset=0xB0,存储类索引+父类索引+接口索引
- A2.1)第1、2个字节是0x03:表示类索引(#3);
- A2.2)第3、4个字节是0x04:表示父类索引(#4);
- A2.3)第5、6个字节是0x00:表示接口索引(#0,表示没有实现任何接口);
A3)offset=0xB6(查表6-8),存储字段信息
- A3.1)第1、2个字节是0x01:表示字段个数;
- A3.2)第3、4个字节是0x02:查表6-9知,字段访问标志是ACC_PRIVATE;
- A3.3)第5、6个字节是0x05:表示name_index(字段名称索引)=#5,(m);
- A3.4)第7、8个字节是0x06:表示desc_index(字段描述符索引)=#6(I==Int);(干货——所以到这里,我们就可以推断出源代码定义的字段为 private int m);
- A3.5)第9、10个字节是0x00,0x00:属性个数和属性表均为0;
A4)offset=0xC0,存储方法信息(查表6-11)
- A4.1)第1、2个字节是0x02:表示方法数量;
- A4.2)第3、4个字节是0x01:查表6-12知,方法访问标志为public;
- A4.3)第5、6个字节是0x07:表示方法名称索引=#7=(干货——实例构造器为方法);
- A4.4)第7、8个字节是0x08:表示方法描述符索引=#8=<>V;
- A4.5)第9、10个字节是0x01:表示属性数量=1;
- A4.6)第11、12个字节是0x09:表示属性信息索引=$9=Code;
- A4.7)第13、14个字节是0x00:表示属性个数;
- A4.7)第15、16个字节是0x0D:......;
A5)offset=0xD0,存储Code属性的信息,如下图所示:
A6)后面我偷个懒,还有一些属性的字节码表示:刚刚介绍了Code属性,接下来是 Exceptions属性,LineNumberTable属性,LocalVariableTable属性,SourceFile属性, ConstantValue属性, InnerClass属性, Deprecated和Synthetic属性,StackMapTable属性,Signature属性,和 BootstrapMethods 属性等, 它们的截图示例如下:
Conconsion)总结下Class字节码文件格式的大致结构(排名分先后)(非常重要):
- 1)Class文件标识符——魔数(CAFEBABY);
- 2)Class文件的次版本号+主版本号;
- 3)常量池(常量个数,(常量类型标志 ,常量值索引)* )
- 4)类索引+父类索引+接口索引;
- 5)字段表集合:字段个数,访问标志,字段名称索引,字段类型描述符索引等;
- 6)方法表集合:方法个数,访问标志,方法名称索引,方法类型描述符索引,属性表集合等;
- 7)属性表集合:这里的属性并不是类中的属性,字节码文件结构中的属性在本文文末有图所示(我只举了部分属性荔枝,详见java类文件结构(字节码文件)中的表6-13):
- 7.1)重要的属性集合有:Code属性,Exceptions属性,LineNumberTable属性,LocalVariableTable属性,SourceFile属性, ConstantValue属性, InnerClass属性, Deprecated和Synthetic属性,StackMapTable属性,Signature属性,和 BootstrapMethods 属性等;(它们的截图示例如A6所示)