博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java类文件结构
阅读量:4046 次
发布时间:2019-05-25

本文共 1537 字,大约阅读时间需要 5 分钟。

三、魔数与Class文件的版本:

       每个Class文件的头4个字节称为魔数(Magic Number), 它唯一的作用是确定这个文件是否为一个能被虚拟机接受的Class文件. 很多文件存储标准中都使用魔数来进行身份识别, 譬如图片格式 ,如 gif或者 jpeg等在文件头中都存有魔数. 使用魔数而不是扩展名来进行识别主要是基于安全方面的考虑, 因为文件扩展名可以随意地必去. 文件格式的制定者可以自由地选择魔数值, 只要这个魔数值还没有被广泛采用过同时又不会引起混淆即可. Class文件的魔数的获得很有浪漫气息. 值为0xCAFEBABE(咖啡宝贝?) 这个魔数值在Java还称做”Oak”语言的时候(大约是1991年前后)就已经确定下来了.

       紧接着魔数的4个字节存储的是Class文件的版本号: 第5和第6个字节是次版本号(minor version), 第7和第8个字节是主版本号(Major Version). Java的版本号是从45开始的, JDK1.1之后的每个JDK大版本发布主版本号向上加1(JDK1.0 ~_1.1 使用了45.0 ~ 45.3的版本号), 高版本的JDK能向下兼容以前版本的Class文件, 但不能运行以后版本的Class文件,即使文件格式并未发生任何变化, 虚拟机也必须拒绝执行超过其版本号的Class文件.

       例如, JDK1.1能支持的版本号为45.0~45.65535的Class文件. 无法执行版本号为46.0以上的Class文件,而JDK1.2则能支持45.0-46.65535的Class文件. 较新的JDK版本为1.7, 可生成的Class文件主版本号最大值为51.0.

四、常量池:

紧接着主次版本号之后的是常量池入口, 常量池可以理解为Class文件之中的资源仓库, 它是Class文件结构中与其他项目关联最多的数据类型, 也是占用Class文件空间最大的数据项目之一, 同时它还是在Class文件中第一个出现的表类型数据项目.

由于常量池中常量的数据是不固定的, 所以在常量池的入口需要放置一项u2类型的数据, 代表常量池容量计数值. 与Java中语言习惯不一样的是, 这个容量计数器是从1而不是从0开始的, 如下图所示, 常量池容量是0x004E, 值为78, 这就代表常量池中有78项常量, 索引值范围为1-78.

常量池中主要存放两大类常量: 字面量(Literal)和符号引用(Symbolic References). 字面量比较接近于Java语言层面的常概念, 如文本字符串, 声明为final的常量值等. 而符号引用则属于编译原理方面的概念,包括了下面三类常量:

  1. 类和接口的全限定名(Fully Qualified Name)
  2. 字段的名称和描述符(Descriptor)
  3. 方法的名称和描述符

Java代码在进行javac编译的时候,并不像C和C++那样有”连接”这一步骤, 而是在虚拟机加载Class文件的时候进行动态连接. 也就是说,在Class文件中不会保存各个方法,字段的最终内存布局信息, 因此这些字段, 方法的符号引用不经过运行期转换的话无法得到真正的内存入口地址, 也就无法直接被虚拟机使用. 当虚拟机运行时, 需要从常量池获得对应的符号引,再在类创建时或运行时解析,翻译到具体的内存地址之中.

常量中的每一项数据都是一个表类型的结构,每个表类型结构的第1个字节是一个u1数据, 用来标识常量的类型, 而后面的部分则取决于它是什么类型,因为不同的类型的常量的结构是不同的. 总共有十几种常量类型,所以对于它的解析是相对要耗时一些的.

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

你可能感兴趣的文章
Yotta企业云盘助力科技行业创高峰
查看>>
Yotta企业云盘更好地为教育行业服务
查看>>
Yotta企业云盘怎么帮助到能源化工行业
查看>>
企业云盘如何助力商业新发展
查看>>
医疗行业运用企业云盘可以带来什么样的提升
查看>>
教育数字智能化能为现有体系带来新的起点
查看>>
媒体广告业如何将内容资产进行高效地综合管理与利用
查看>>
能源化工要怎么管控核心数据
查看>>
媒体广告业如何运用云盘提升效率
查看>>
企业如何运用企业云盘进行数字化转型-实现新发展
查看>>
司法如何运用电子智能化加快现代化建设
查看>>
iSecret 1.1 正在审核中
查看>>
IOS开发的开源库
查看>>
IOS开发的开源库
查看>>
Jenkins - sonarqube 代码审查
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成(一)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
Golang struct 指针引用用法(声明入门篇)
查看>>
Linux 粘滞位 suid sgid
查看>>