Java class文件格式之常量池.pdfVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Java class文件格式之常量池

Java class 文件格式之常量池 常量池中各数据项类型详解 常量池中的数据项是通过索引来引用的, 常量池中的各个数据项之间也会相互引用。在这 11 中常量池数据项类型中, 有两种比较基础, 之所以说它们基础, 是因为这两种类型的数据项会被其他类型的数据项引用。 这两种数据类型就是 CONSTANT_Utf8 和 CONSTANT_NameAndType ,其中 CONSTANT_NameAndType 类型的数据项 (CONSTANT_NameAndType_info )也会引用CONSTANT_Utf8 类型的数据项(CONSTANT_Utf8_info )。 与其他介 绍常量池的书籍或其他资料不同, 本着循序渐进和先后分明的原则, 我们首先对这两种比较基本的类型的数据项进行介绍, 然后再依次介绍其他 9 中数据项。 (1 )CONSTANT_Utf8_info 一个 CONSTANT_Utf8_info 是一个 CONSTANT_Utf8 类型的常量池数据项, 它存储的是一个常量字符串。 常量池 中的所有字面量几乎都是通过 CONSTANT_Utf8_info 描述的。下面我们首先讲解 CONSTANT_Utf8_info 数据项的存储格 式。在前面的文章中, 我们提到, 常量池中数据项的类型由一个整型的标志值(tag )决定,所以所有常量池类型的 info 中都必须有一个tag 信息, 并且这个 tag 值位于数据项的第一个字节上。 一个 11 中常量池数据类型,所以就有 11 个 tag 值表示这 11 中类型。而CONSTANT_Utf8_info 的tag 值为 1 ,也就是说如果虚拟机要解析一个常量池数据项, 首先去读 这个数据项的第一个字节的 tag 值,如果这个 tag 值为 1 ,那么就说明这个数据项是一个 CONSTANT_Utf8 类型的数据项。 紧挨着 tag 值的两个字节是存储的字符串的长度 length ,剩下的字节就存储着字符串。 所以, 它的格式是这样的: 其中 tag 占一个字节, length 占 2 个字节, bytes 代表存储的字符串, 占 length 字节。所以, 如果这个 CONSTANT_Utf8_info 存储的是字符串Hello ,那么他的存储形式是这样的: 1 / 8 现在我们知道了 CONSTANT_Utf8_info 数据项的存储形式, 那么 CONSTANT_Utf8_info 数据项都存储了什么字符串 呢? CONSTANT_Utf8_info 可包括的字符串主要以下这些:  程序中的字符串常量  常量池所在当前类(包括接口和枚举)的全限定名  常量池所在当前类的直接父类的全限定名  常量池所在当前类型所实现或继承的所有接口的全限定名  常量池所在当前类型中所定义的字段的名称和描述符  常量池所在当前类型中所定义的方法的名称和描述符  由当前类所引用的类型的全限定名  由当前类所引用的其他类中的字段的名称和描述符  由当前类所引用的其他类中的方法的名称和描述符  与当前 class 文件中的属性相关的字符串, 如属性名等 总结一下, 其中有这么五类: 程序中的字符串常量, 类型的全限定名, 方法和字段的名称, 方法和字段的描述符, 属 性相关字符串。 程序中的字符串常量不用多说了, 我们经常使用它们创建字符串对象, 属性相关的字符串, 等到 讲到 class 中的属性信息(attibute )时自会提及。方法和字段的名称也不用多说了 。 剩下的就是类型的全限定名, 方法和字段的描述符 。 还有一点需要说明, 类型的全限定名, 方法和字段的名称, 方法和字段的描述符, 可以 是本类型中定义的, 也可能是本类中引用的其他类的。 下面我们通过一个例子来进行说明。 示例源码: 1. package com.bjpowernode.test; 2. 3. public class Programer extends Person { 4. 5. static String company = CompanyA; 6. 7. static{ 8.

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档