软件世界网 购物 网址 三丰软件 | 小说 美女秀 图库大全 游戏 笑话 | 下载 开发知识库 新闻 开发 图片素材
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
移动开发 架构设计 编程语言 Web前端 互联网
开发杂谈 系统运维 研发管理 数据库 云计算 Android开发资料
  软件世界网 -> 研发管理 -> Class字节码文件结构总结 -> 正文阅读

[研发管理]Class字节码文件结构总结


【0】README
0.1)本文总结于 Clas字节码文件,旨在理清 Class字节码文件的大体结构;


【1】干货开始
[img]http://img.blog.csdn.net/20160328150603977[img]http://img.blog.csdn.net/20160328150607694

对上图的分析(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;
  • [img]http://img.blog.csdn.net/20160327203535771

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:......;
  • [img]http://img.blog.csdn.net/20160327203742463

A5)offset=0xD0,存储Code属性的信息,如下图所示:
[img]http://img.blog.csdn.net/20160327203809493



A6)后面我偷个懒,还有一些属性的字节码表示:刚刚介绍了Code属性,接下来是 Exceptions属性,LineNumberTable属性,LocalVariableTable属性,SourceFile属性, ConstantValue属性, InnerClass属性, Deprecated和Synthetic属性,StackMapTable属性,Signature属性,和 BootstrapMethods 属性等, 它们的截图示例如下:

  • [img]http://img.blog.csdn.net/20160327203822839
  • [img]http://img.blog.csdn.net/20160327204040137
  • [img]http://img.blog.csdn.net/20160327204054621
  • [img]http://img.blog.csdn.net/20160327204103747
  • [img]http://img.blog.csdn.net/20160327204534982
  • [img]http://img.blog.csdn.net/20160327204547576


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所示)
    • [img]http://img.blog.csdn.net/20160327203747430

......显示全文...
    点击查看全文


上一篇文章      下一篇文章      查看所有文章
2016-03-28 21:49:48  
研发管理 最新文章
拉格朗日乘数
maven之可视化项目依赖(Visualizingdepend
mac效率工具
Atitit.css规范bem项目中CSS的组织和管理
git入门
Asimplemodelfordescribingbasicsourcesofp
Linux进程管理浅析
我的openwrt学习笔记(十九):linux便捷开
2、微控制器选择
Git使用手册:为Git仓库创建Submodule
360图书馆 软件开发资料 文字转语音 购物精选 软件下载 美食菜谱 新闻资讯 电影视频 小游戏 Chinese Culture 股票 租车
生肖星座 三丰软件 视频 开发 短信 中国文化 网文精选 搜图网 美图 阅读网 多播 租车 短信 看图 日历 万年历 2018年1日历
2018-1-17 9:23:06
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  软件世界网 --