当前位置: 首页 > news >正文

安远做网站做服务网站要多少钱

安远做网站,做服务网站要多少钱,潍坊网站开发招聘信息,2023年没必要学php了** JVM常量池中各数据项类型详解 ** 关于常量池的大概内容#xff0c; 已经在 深入理解 JVM Class文件格式#xff08;一#xff09; 中讲解过了#xff0c; 这篇文章中还介绍了常量池中的11种数据类型。 本文的任务是详细讲解这11种数据类型#xff0c; 深度剖析源文件…** JVM常量池中各数据项类型详解 ** 关于常量池的大概内容 已经在 深入理解 JVM Class文件格式一 中讲解过了 这篇文章中还介绍了常量池中的11种数据类型。 本文的任务是详细讲解这11种数据类型 深度剖析源文件中的各种信息是以什么方式存放在常量池中的。 我们知道 常量池中的数据项是通过索引来引用的 常量池中的各个数据项之间也会相互引用。在这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 那么他的存储形式是这样的 现在我们知道了CONSTANT_Utf8_info数据项的存储形式 那么CONSTANT_Utf8_info数据项都存储了什么字符串呢 CONSTANT_Utf8_info可包括的字符串主要以下这些 程序中的字符串常量常量池所在当前类包括接口和枚举的全限定名常量池所在当前类的直接父类的全限定名常量池所在当前类型所实现或继承的所有接口的全限定名常量池所在当前类型中所定义的字段的名称和描述符常量池所在当前类型中所定义的方法的名称和描述符由当前类所引用的类型的全限定名由当前类所引用的其他类中的字段的名称和描述符由当前类所引用的其他类中的方法的名称和描述符与当前class文件中的属性相关的字符串 如属性名等 总结一下 其中有这么五类 程序中的字符串常量类型的全限定名方法和字段的名称方法和字段的描述符属性相关字符串 程序中的字符串常量不用多说了 我们经常使用它们创建字符串对象 属性相关的字符串 等到讲到class中的属性信息attibute时自会提及。 方法和字段的名称也不用多说了 。 剩下的就是类型的全限定名方法和字段的描述符 这就是上篇文章中提及的特殊字符串 不熟悉的同学可以先读一下上篇文章 深入理解 JVM Class文件格式二 。 还有一点需要说明 类型的全限定名 方法和字段的名称 方法和字段的描述符 可以是本类型中定义的 也可能是本类中引用的其他类的。 下面我们通过一个例子来进行说明。 示例源码 package com.jg.zhang;public class Programer extends Person {static String company CompanyA;static{System.out.println(staitc init);}String position;Computer computer;public Programer() {this.position engineer;this.computer new Computer();}public void working(){System.out.println(coding...);computer.working();} }别看这个类简单 但是反编译后 它的常量池有53项之多。 在这53项常量池数据项中 各种类型的数据项都有 当然也包括不少的CONSTANT_Utf8_info 。 下面只列出反编译后常量池中的CONSTANT_Utf8_info 数据项 #2 Utf8 com/jg/zhang/Programer //当前类的全限定名 #4 Utf8 com/jg/zhang/Person //父类的全限定名 #5 Utf8 company //company字段的名称 #6 Utf8 Ljava/lang/String; //company和position字段的描述符 #7 Utf8 position //position字段的名称 #8 Utf8 computer //computer字段的名称 #9 Utf8 Lcom/jg/zhang/Computer; //computer字段的描述符 #10 Utf8 clinit //类初始化方法即静态初始化块的方法名 #11 Utf8 ()V //working方法的描述符 #12 Utf8 Code //Code属性的属性名 #14 Utf8 CompanyA //程序中的常量字符串 #19 Utf8 java/lang/System //所引用的System类的全限定名 #21 Utf8 out //所引用的out字段的字段名 #22 Utf8 Ljava/io/PrintStream; //所引用的out字段的描述符 #24 Utf8 staitc init //程序中的常量字符串 #27 Utf8 java/io/PrintStream //所引用的PrintStream类的全限定名 #29 Utf8 println //所引用的println方法的方法名 #30 Utf8 (Ljava/lang/String;)V //所引用的println方法的描述符 #31 Utf8 LineNumberTable //LineNumberTable属性的属性名 #32 Utf8 LocalVariableTable //LocalVariableTable属性的属性名 #33 Utf8 init //当前类的构造方法的方法名 #41 Utf8 com/jg/zhang/Computer //所引用的Computer类的全限定名 #45 Utf8 this //局部变量this的变量名 #46 Utf8 Lcom/jg/zhang/Programer; //局部变量this的描述符 #47 Utf8 working //woking方法的方法名 #49 Utf8 coding... //程序中的字符串常量 #52 Utf8 SourceFile //SourceFile属性的属性名 #53 Utf8 Programer.java //当前类所在的源文件的文件名上面只列出了反编译结果中常量池中的CONSTANT_Utf8_info数据项。 其中第三列不是javap反编译的输出结果 而是我加上的注释。 读者可以对比上面的程序源码来看一下 这样的话 就可以清楚的看出 源文件中的各种字符串 是如何和存放到CONSTANT_Utf8_info中的。 这里要强调一下 源文件中的几乎所有可见的字符串都存放在CONSTANT_Utf8_info中 其他类型的常量池项只不过是对CONSTANT_Utf8_info的引用。 其他常量池项 把引用的CONSTANT_Utf8_info组合起来 进而可以描述更多的信息。 下面将要介绍的CONSTANT_NameAndType_info就可以验证这个结论。 2 CONSTANT_NameAndType类型的数据项 常量池中的一个CONSTANT_NameAndType_info数据项 可以看做CONSTANT_NameAndType类型的一个实例 。 从这个数据项的名称可以看出 它描述了两种信息第一种信息是名称Name 第二种信息是类型Type 。 这里的名称是指方法的名称或者字段的名称 而Type是广义上的类型 它其实描述的是字段的描述符或方法的描述符。 也就是说 如果Name部分是一个字段名称 那么Type部分就是相应字段的描述符 如果Name部分描述的是一个方法的名称 那么Type部分就是对应的方法的描述符。 也就是说 一个CONSTANT_NameAndType_info就表示了一个方法或一个字段。 下面先看一下CONSTANT_NameAndType_info数据项的存储格式。 既然是常量池中的一种数据项类型 那么它的第一个字节也是tag 它的tag值是12 也就是说 当虚拟机读到一个tag为12的常量池数据项 就可以确定这个数据项是一个CONSTANT_NameAndType_info 。 tag值以下的两个字节叫做name_index 它指向常量池中的一个CONSTANT_Utf8_info 这个CONSTANT_Utf8_info中存储的就是方法或字段的名称。 name_index以后的两个字节叫做descriptor_index 它指向常量池中的一个CONSTANT_Utf8_info 这个CONSTANT_Utf8_info中存储的就是方法或字段的描述符。 下图表示它的存储布局 下面举一个实例进行说明 实例的源码为 package com.jg.zhang;public class Person {int age;int getAge(){return age;} }常量池一共有21项 我们可以看到 一共有两个CONSTANT_NameAndType_info 数据项 分别是第#11项和第#19项 其中第#11项的CONSTANT_NameAndType_info又引用了常量池中的第#7项和第#8项 被引用的这两项都是CONSTANT_Utf8_info 它们中存储的字符串常量值分别是 和 V。 其实他们加起来表示的就是父类Object的构造方法。 那么这里为什么会是父类Object的构造方法而不是本类的构造方法呢 这是因为类中定义的方法如果不被引用也就是说在当前类中不被调用 那么常量池中是不会有相应的 CONSTANT_NameAndType_info 与之对应的 只有引用了一个方法 才有相应的CONSTANT_NameAndType_info 与之对应。 这也是为什么说CONSTANT_NameAndType_info 是方法的符号引用的一部分的原因。 这里提到一个新的概念 叫做方法的符号引用 这个概念会在后面的博客中进行讲解 可以看到 在源码存在两个方法 分别是编译器默认添加的构造方法和我们自己定义的getAge方法 因为并没有在源码中显示的调用这两个方法所以在常量池中并不存在和这两个方法相对应的CONSTANT_NameAndType_info 。 之所以会存在父类Object的构造方法对应的CONSTANT_NameAndType_info 是因为子类构造方法中会默认调用父类的无参数构造方法。 我们将常量中的其他信息去掉 可以看得更直观 下面讲解常量池第#19项的CONSTANT_NameAndType_info 它引用了常量池第#5项和第#6项 这两项也是CONSTANT_Utf8_info 项 其中存储的字符串分别是age和I 其中age是源码中字段age的字段名 I是age字段的描述符。 所以这个CONSTANT_NameAndType_info 就表示对本类中的字段age的引用。 除去常量池中的其他信息 可以看得更直观 和方法相同 只定义一个字段而不引用它在源码中表现为不访问这个变量 那么在常量池中也不会存在和该字段相对应的CONSTANT_NameAndType_info 项。这也是为什么说CONSTANT_NameAndType_info作为字段符号引用的一部分的原因。 这里提到一个新的概念 叫做字段的符号引用 这个概念会在后面的博客中进行讲解 在本例中之所以会出现这个CONSTANT_NameAndType_info 是因为在源码的getAge方法中访问了这个字段 int getAge(){return age;}下面给出这两个CONSTANT_NameAndType_info真实的内存布局图 和Object构造方法相关的CONSTANT_NameAndType_info的示意图 和age字段相关的CONSTANT_NameAndType_info示意图 这两张图能够很好的反映出CONSTANT_NameAndType_info和CONSTANT_Utf8_info 这两种常量池数据项的数据存储方式 也能够真实的反应CONSTANT_NameAndType_info和CONSTANT_Utf8_info 的引用关系。 总结 本篇博客就到此为止 在本文中我们主要介绍了常量池中的两种数据项 CONSTANT_NameAndType_info 和 CONSTANT_Utf8_info 。 其中CONSTANT_Utf8_info存储的是源文件中的各种字符串 而CONSTANT_NameAndType_info表述的是源文件中对一个字段或方法的符号引用的一部分即 方法名加方法描述符 或者是 字段名加字段描述符。在下一篇博客中 继续讲解常量池中的其他类型的数据项 。
http://www.pierceye.com/news/354569/

相关文章:

  • 任家房网站建设郑州百度网站推广
  • 深圳建设网站的公司简介WordPress多功能投稿
  • 简述织梦网站上传及安怎样在网站上做免费的推广
  • 关于信用体系建设的网站wordpress新闻类模板下载
  • 免费行情软件网站下载大全爱学校vi设计案例
  • 网站外包优化怎样做免费抽皮肤的网站
  • 东八区网站建设网站源码在哪里
  • 重点建设专业 专题网站搜狗官方网站
  • 微信营销工具有哪些使用最佳搜索引擎优化工具
  • 网站推广意识薄弱wordpress授权协议
  • 用php做高中数学题库网站阿里网站建设教程
  • 大兴网站建设公司电话东莞企业网站制作怎么做
  • 网站维护有啥用2021跨境电商最火的产品
  • 专业的东莞网站排名wordpress 客户端使用
  • 做网站需要什么人才网站建设与规划案例
  • 你学做网站学了多久建设网站困难的解决办法
  • 东莞如何搭建网站建设做招聘信息的网站
  • 网站行业认证怎么做安卓开发技术
  • 泉州城乡住房建设厅网站网站运营方案ppt
  • 免费做网站wxp114五种常用的网站推广方法
  • 简单的网站建设找哪个公司新网站seo技术
  • 电子网址怎么创建下载优化大师app
  • 网站上传服务器教程wordpress 开启多用户
  • 做网站的公司重庆互联网营销方式
  • 在线探测网站开发语言东莞人才市场现场招聘会地址
  • 检测网站是否被挂黑链seo网站营销推广
  • 当今网站开发技术的现状自己做的网站怎么上排行榜
  • 外贸没有公司 如何做企业网站?成都市住房和城乡建设局官网查询
  • 公证网站建设管理无锡百度正规推广
  • 免费海外网站建设自学设计软件的免费网站