深入理解JVM(六)——类文件结构

13 篇文章 0 订阅

Java诞生之初就有的口号,Write Once,Run Anywhere

Java规范分为Java语言规范和Java虚拟机规范,Java实现平台无关性的基础是虚拟机和字节码存储格式,Java虚拟机不与包括Java在内的任何语言绑定,它只与Class文件这种特定的二进制文件格式关联

时至今日,已经有很多语言运行在Java虚拟机之上,包括Groovy,JRuby,Jython,Scala等,只要他们通过编译器,得到虚拟机可以识别的Class文件,那么就可以在虚拟机上运行。

Class类文件的结构

任何一个Class文件都对应唯一的一个类或者接口的定义信息,反之不然,类和接口不一定定义在文件里(可以通过Classloader生成)。

Class文件是一组以8Byte为基础单位的二进制流(高位在前分割)

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

无符号数

无符号数属于基本数据类型,如

无符号数含义
u11个字节
u22个字节
u44个字节
u88个字节

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

类型名称数量说明
u4magic1魔数,头4个字节,确定这个Class文件是否能被虚拟机接受,值为0xCAFEBABE,出于安全不用文件名后缀而用魔数
u2minor_version15-6字节,次版本号,JDK版本向下兼容,JDK版本从45(1.1)开始,以后每个大版本发布,主版本号加1,如JDK1.6是50,最新的1.7生成的Class最大值为51
u2major_version17-8字节,主版本号,同上
u2constant_pool_count1常量池入口,从1开始计算(其它均从0开始),代表常量池中有多少项常量,
cp_infoconstant_poolconstant_pool_count-1常量池,字面量(文本字符串,final常量值等)和符号引用(类和接口的全限定名,字段的名称和描述符,方法的名称和描述符),常量池中的 每一项常量都是一个表,JDK1.7之前有11种表结构,之后有14种;详细见下节
u2access_flag1访问标志,表示这个是类还是接口,是否为public,是否为abstract,是否为final等
u2this_class1该列的全限定名
u2super_class1父类的全限定名
u2interfaces_count1接口计数器
u2interfacesinterfaces_count接口索引表
u2fileds_count1字段计数器,接口或类中声明的变量
filed_infofiledsfileds_count字段表
u2methods_count1
method_infomethodsmethods_count
u2attributes_count1
attribute_infoattributesattributes_count

常量池的项目类型有

标志描述
1UTF-8编码的字符串
3整型字面量
4浮点型字面量
5长整型字面
6双精度浮点型字面量
7类或接口的符号引用
8字符串类型字面量
9字段的符号引用
10类中方法的符号引用
11接口中方法的符号引用
12字段或方法的部分符号引用
15表示方法句柄
16标志方法类型
18表示一个动态方法调用点

可以通过javap工具的-verbose参数输出字节码内容,可以观察到引用常量池中的常量

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值