深入了解JVM——类文件结构

6 篇文章 0 订阅

本文为 《深入理解Java虚拟机》第六章内容的学习笔记,部分内容经过二次加工。若对相关知识感兴趣,推荐购书深入阅读。若认为文章涉嫌侵权,请联系作者及时删除。
本作品采用 知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议 (CC BY-NC-SA 3.0 CN) 进行许可 。非商业性质转载请注明作者和出处,禁止商业性质转载。
开源创造世界

无关性的基石

Java虚拟机不和包括Java在内的任何语言绑定,它只与Class文件这种特定的二进制文件格式所关联,Class文件中包含了Java虚拟机指令集和符号表以及若干其他辅助信息。

我们可以这样理解:任何一门语言,只要可以按照符合JVM规范的编译出Class文件,都可以再JVM上运行。

Class类文件结构

根据Java虚拟机规范的规定,Class文件格式采用一种类似于C语言结构体的伪结构来存储数据,这种伪结构中只有两种数据类型:无符号数和表。

无符号数属于基本的数据类型,以u1、u2、u4、u8来分别代表1个字节、2个字节、4个字节和8个字节的无符号数,用来描述数字、索引引用、数量值或者按UTF-8编码构成字符串值。

表是由多个无符号数或者其他表作为数据项构成的复合数据类型,所有表都习惯的以_info结尾。用于描述有层次关系的复合结构的数据。这个Class文件本质上就是一张表

Class文件格式

类型名称数量
u4magic1
u2minor_version1
u2major_version1
u2constant_pool_count1
cp_infoconstant_poolconstant_pool_count-1
u2access_flags1
u2this_class1
u2super_class1
u2interfaces_count1
u2interfacesinterfaces_count
u2fields_count1
field_infofieldsfields_count
u2methods_count1
method_infomethodsmethods_count
u2attributes_count1
attribute_infoattributesattributes_count

magic number 与 Class文件的版本

每个Class文件的头4个字节称为 magic number,作用是确定这个文件是否为一个能被虚拟机接受的Class文件。其值是 0xCAFEBABE

Java版本号从45开始,JDK1.1之后每个JDK大版本发布主版本号向上加1,高版本的JDK能向下兼容一起签版本的Class文件,但不能运行以后版本的Class文件。

常量池

constant_pool_count代表常量池容量计数值,计数值从1开始。0索引位置用于满足后面某些指向常量池的索引值的数据在特定情况下需要表达“不引用任何一个常量池项目”的含义。Class文件中只有常量池的容量计数是从1开始的。

常量池中存放字面量 Literal 和符号引用 Symbolic References。

字面量比较接近Java中规定的常量概念。符号引用属于编译原理方面的概念包括:
- 类和接口的全限定名 Fully Qualified Name
- 字段的名称和描述符 Descriptor
- 方法的名称和描述符

常量池中的每一项常量都是一个表,截止JDK1.7 共用14中不同的表结构。

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

this_class、super_class、interfaces用于确定类的继承关系。

字段表集合

field_info用于描述接口或类中声明的变量。不包括局部变量。

不包括父类的变量

方法表集合

method_info存储方法的描述。

不包括没有被重写的父类方法

属性表集合

attribute_info为属性表。在Class文件、字段表、方法表都可以携带自己的属性表集合,以用于描述某些场景专有的信息。

字节码指令简介

Java虚拟机的指令由一个字节长度的、代表着某种特定操作含义的数字(操作码 Opcode)以及跟随器其后的零值多个代表此操作所需参数(操作数 Operands)而构成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值