《深入理解java虚拟机》—类文件结构(6)

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

了解类文件结构主要是为下面一章类加载机制做铺垫的,从小我们上计算机课的时候老师就一直跟我们强调,电脑只认识0和1,所以不管是什么样的语言编写最终都是需要编译成0和1的结构,也就是我们所说的二级制文件,而在我们刚开始学习java的时候,就知道java言语是跨平台的,记得当时的口号是一次编写,到处运行,事实也是这样,主要原因是虚拟机供应商们研制了很多运行在不同平台上的虚拟机,这些虚拟机都可以载入和运行同一种与平台无关的字节码。java程序员可以理解为.class文件,随着科技的发展,未来的java虚拟机可以运行不同的语言,在语言无关性上做出突破,其实道理也是一样的,不同的言语只要被不同的编译器编译成相同的规则的.class文件就行,接下来具体看看Class文件的结构。

一、Class文件结构

Class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序经凑的排列在Class文件之中,中间几乎没有任何分隔符。Class文件格式采用一种类似于C语言结构的伪结构来存储结构,这种伪结构只有两种存储类型,无符号数和表。

  • 无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节,可以描述数字、索引引用、数量值或者按照UTF-8编码构成字符串值。
  • 表是由多个无符号数或者其他表作为数据项构成的复合数据类型,习惯以“_info”结尾,整个Class文件本质上就是一张表。

每个Class文件的头四个字节称为魔数,作用是确定这个文件是否为一个能被虚拟机接受的Class文件,也是很多文件中用来作为身份标识的,同时跟java商标的出现也有一定渊源。紧接着魔数的4个字节存储的是Class的版本号,java的版本号是从45开始的,其中第5第6个字节是次版本号,第7第8是主版本号,值得注意的是高版本的JDK能向下兼容以前的版本,但是不能向上兼容。

紧接着主版本号之后的是常量池入口,可以理解为Class文件之中的资源仓库,是Class文件结构中与其他项目关联最多的数据类型,也是占用Class文件空间最大的数据项目之一,同时还是Class文件中第一个出现的表类型数据项目。由于常量池中常量的数量是不固定的,所以在常量池的入口需要放置一项u2类型的数据,代表常量池容量计数值,是从1开始的,设计者考虑0项常量空出来表达“不引用任何一个常量池项目”,常量池主要存放两大类常量:字面量和符号引用,字面量比较接近于java语言层的常量概念,如文本字符串,声明为final的常量值等。而符号引用属于编译原理方面的概念,包括:类和借口的全限定名;字段的名称和描述符;方法的名称和描述符。常量池中每一项常量都是一个表,JDK1.7之前有11中表结构,后来增加了3种,变为14种,具体的可以查阅资料,值得一提的是java程序中如果定义了超过64kb英文字符的变量或者方法名,将会无法编译,这个就是CONSTANT_Utf8_info型常量结构中的length决定的。

访问标志是在常量池结束之后的两个字节,用于标识一些类或者接口层次的访问信息,包括这个Class是类还是接口,是否定义为public类型等。

类索引和父类索引都是一个u2类型的数据,而接口索引集合是一组u2类型的数据的集合,Class文件中由着三项数据来确定这个类的继承关系。

字段表集合用于描述接口或者类中声明的变量,但是不包括局部变量。

方法表集合用于描述接口或者类中的定义的方法。

属性表集合用以描述某些场景专有的信息。

二、字节码指令简介

java虚拟机的指令是由一个字节长度的、代表着某种特定操作含义的数字,以及跟随其后的零至多个代表此操作所需参数而构成。

  1. 字节码与数据类型:大多数的指令都包含了其操作所对应的数据类型信息;
  2. 加载和存储指令:用于将数据在栈帧中的局部变量表和操作数栈之间来回传输;
  3. 运算指令:用于对两个操作数栈上的值进行某种特定运算,并将结果重新存入到操作栈顶;
  4. 类型转换指令:将两种不同的数值类型镜像相互转换;
  5. 对象创建和访问指令:创建实例用new关键字;
  6. 操作数栈管理指令
  7. 控制转移指令:条件分支
  8. 方法调用和返回指令
  9. 异常处理指令
  10. 同步指令

三、共有设计和私有实现

java虚拟机规范描绘了java虚拟机应有的共同程序存储格式:Class文件格式以及字节码指令集。但是一个优秀的虚拟机实现在满足虚拟机规范的前提下,做出适当的修改以获得更高的性能、更低的内存消耗或者更好的移植性才是重点。

四、Class文件结构的发展

JDK的版本从最初的1.0到现在的1.8甚至是1.9,技术体系在不断的更新,但是Class文件的结构却一直很稳定,几乎从来没有发生过变动,期待未来的发展变化。

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » 《深入理解java虚拟机》—类文件结构(6)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏