JavaClass字节码文件结构详解解读.docx

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
JavaClass字节码文件结构详解解读

Class字节码中有两种数据类型:字节数据直接量:这是基本的数据类型。共细分为u1、u2、u4、u8四种,分别代表连续的1个字节、2个字节、4个字节、8个字节组成的整体数据。表:表是由多个基本数据或其他表,按照既定顺序组成的大的数据集合。表是有结构的,它的结构体现在,组成表的成分所在的位置和顺序都是已经严格定义好的。Class字节码总体结构如下:具体详解请参考/DLevin/archive/2011/09/05/358033.html我在这里要说明几个细节问题:为什么说常量表的数量是constant_pool_count-1,且索引从1开始而不是0。其实根本原因在于,索引为0也是一个常量(保留常量),只不过它不存在常量表,这个常量就对应null值。因此加上这个系统保留常量,常量个数共为constant_pool_count个,但是常量表数量要减1。在常量池中,如果存在long型或double型字面量,它们会占用两个连续索引。比如:假设一个类中只有一个int型字面量1和一个double型字面量1(当然这种假设是不可能的,因为总会有类名字面量等),则常量池个数为3,而不是2。这正是因为double字面量占用了两个连续的索引。接下来,贴出一个小demo来展示如何读取字节码:ClassParser负责把握Class字节码整体结构的解析。package?com.lixin;import?java.io.IOException;import?java.io.InputStream;public?class?ClassParser?{private?InputStream?in;public?ClassParser(InputStream?in)?{this.in?=?in;}public?void?parse()?throws?IOException?{//?魔数magicNumber();//?主次版本号version();//?常量池constantPool();//?类或接口修饰符accessFlag();//?继承关系(当前类、父类、父接口)inheritence();//?字段集合fieldList();//?方法集合methodList();//?属性集合attributeList();}private?void?attributeList()?throws?IOException?{line();int?attrLength?=?StreamUtils.read2(in);System.out.println(共有+attrLength+个属性);for?(int?i=0;iattrLength;i++)?{line();attribute();}}private?void?attribute()?throws?IOException?{int?nameIndex?=?StreamUtils.read2(in);?int?length?=?StreamUtils.read4(in);?byte[]?info?=?StreamUtils.read(in,?length);System.out.println(nameIndex:+nameIndex);System.out.println(length:+length);System.out.println(info:+info);}private?void?methodList()?throws?IOException?{int?length?=?StreamUtils.read2(in);System.out.println(共有+length+个方法);for?(int?i=0;ilength;i++)method();}private?void?method()?throws?IOException?{System.out.println(---------------------);int?accessFlag?=?StreamUtils.read2(in);int?nameIndex?=?StreamUtils.read2(in);int?descriptorIndex?=?StreamUtils.read2(in);System.out.println(accessFlag:+accessFlag);System.out.println(nameIndex:+nameIndex);System.out.println(descriptorIndex:+descriptorIndex);attributeList();}private?void?fieldList()?throws?IOException?{line();int?length?=?StreamUti

文档评论(0)

22ffbqq + 关注
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档