jvm(6)-Class字节码文件结构总结
来源:互联网 发布:bitcomet for mac 编辑:程序博客网 时间:2024/05/29 07:32
【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=<init>(干货——实例构造器为<init>方法);
- 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所示)
0 0
- jvm(6)-Class字节码文件结构总结
- jvm(6)-java类文件结构(字节码文件)
- 字节码文件class文件的结构
- JVM class文件结构
- jvm class文件结构
- Java的字节码class文件结构
- .class文件(字节码)的结构
- JVM学习04-class字节码的结构
- JVM的class文件结构
- JVM 之 Class文件结构
- JVM-class文件结构解析
- JVM----Class类文件结构
- class字节码类结构
- JVM笔记5:Class文件结构
- 深入JVM的Class文件结构
- 深入JVM的Class文件结构
- JVM Class 文件结构详解一
- JVM Class 文件结构详解二
- 在plsql中控制调用者权限
- 优化的三叉哈夫曼树
- SSM框架(Spring+SpringMVC+MyBatis) ——详细整合教程
- Oracle学习笔记(一)——Oracle介绍及安装
- 中介者模式及MVP、MVVM上的体现
- jvm(6)-Class字节码文件结构总结
- 使用Go语言工作400天后的感受
- Android 第八天_重置版_服务service
- 进程间通讯总结 (3)
- C++实现的委托机制
- JS进阶书籍
- Android 第八天_重置版_服务_注意事项
- 文本分类——KNN算法
- html-progress meter