深入Java虚拟机之 -- 类文件结构(字节码)

系列文章:

深入Java虚拟机之 – 总结面试篇
深入Java虚拟机之 — JVM的爱恨情仇
JAVA 垃圾回收机制(一) — 对象回收与算法初识
JAVA 垃圾回收机制(二) — GC回收具体实现
深入Java虚拟机之 – 类文件结构(字节码)
深入Java虚拟机之 – 类加载机制

我们都知道Java 是跨平台的,原因是 Java 的虚拟机只认识 字节码 (ByteCode),甚至只要你的语言在运行时能够装换成 字节码,同样可以在虚拟机上运行,比如 JRuby、Scala等语言;这也是当初Java设计者说出的霸气宣言 “Write Once , Run Anywhere”! (这章比较枯燥,我会尽量剔除一些不怎么用到的知识)
实现语言无关性的基础认识虚拟机和字节码存储结构。它只与 "Class 文件"这种特定的二进制格式所关联,Class 文件包含了 Java 虚拟机指令集和符号表以及若干其他辅助信息。

一、Class 类文件的结构

Class 文件是一组以8位字节为基础的二进制流,没有间隙存在,当需要占用8位字节以上空间的数据项时,则会按照高位在前的方式分割成若干个8为字节进行存储。
Class 文件采用与C语言类似的伪结构,这种结构只有两种数据:无符号和表

  • 无符号:属于基本类型,如u1,u2、u3、u4和u8来区分1、2、3、4个字节和8个字节的无符号数,无符号数可以用来描述数字、索引引用、数量之或者按照utf-8编码构成的字符串值。
  • 表:是由多个无符号或者其他表作为数据项构成的符合数据类型,所有的表都习惯用“_info”结尾 ,用于描述有层次关系的符合结构的数据,如字段表、方法表、属性表等,整个Class文件本质上就是一张表。

无论是无符号还是表,当需要描述同一类型但数量不定的多个数据时,会使用一个前置的容量计数器+若干个连续的数据项的形式,这一类型我们叫做集合

二、魔数与Class版本号

每个Class文件的前4个字节成为魔数,它的唯一作为就是标明这个Class能不能被虚拟机结构。魔数的值为 OXCAFEBABE (咖啡宝贝),还是挺好记的,然后第5,第6个字节,表示此版本号,第7,第8则表示次版本号。如(图片来自深入Java虚拟机第2版):
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190415140722243.png在这里插入图片描述

三、常量池

从上面看,从第9位开始就是常量池了,常量池可以理解为 Class 文件之中的资源仓库,它是 Class 文件结构中与其他项目关联最多的数据类型,也是占 Class 文件控件最大的数据项目之一。不过,常量池的数量是不固定的,所以在入口设置了一项u2类型的数据,代表常量池容量计数值。这个计算值是从1开始的,这是为了满足后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的意义。
常量池中主要存放两大类型,字面量和符号引用;字面量是Java语言层面的常量概念,符号引用是编译原理方面的概念 ,如下图:
在这里插入图片描述
字面量比较好理解,符号引用怎么解释呢?原因是 Java 不想C/C++有"连接"这一步骤, Java是动态语言,是在虚拟机加载 Class 文件的时候,动态连接的;也就是说, Class 文件不会保存各个方法、字段的最终内存信息,如果不经过转换,则得不到真正的内存入口,也就没办法在虚拟机引用了。所以,当虚拟机运行时,需要从常量池中获取对应的符号引用,再在创建类时或运行时,解析得到真正的内存寻址。

类索引、父类索引与接口索引集合

类索引和父类索引都是一个 u2 类型的数据,而接口索引集合则是一个 u2 类型的数据集合。

  • 类索引:用来确定这个类的全限定名
  • 父类索引:用来确定父类全限定名,Java不允许多继承,所以只有一个
  • 接口索引集合:用来确定这个类实现了哪些接口

后面都是一些表的解释,这里就不写出来了。有兴趣可取查看深入Java虚拟机第三章 – 类文件结构

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值