为了账号安全,请及时绑定邮箱和手机立即绑定

【JVM】深入解析class类文件

标签:
Java

众所周知,我们在运行java代码时,首先java文件会被编译成class文件,然后将class文件装载到java虚拟机中。那么这个class文件到底是什么呢,今天我们就来分析一下。


首先编写一个测试类Test,内容很简单,就是输出“hello,world”


webp

Test类

webp

java文件以及编译生成的class文件


使用WinHex工具打开这个Test.class文件,会发现class文件内容是这样的:


webp

class文件内容的一部分

观察这些数据,不难发现,class文件是一组以8位字节为基本单位的二进制流,各个数据项目严格地按顺序排列在一起,中间没有空隙。

那么图中这些16进制数据代表什么含义呢?

1.每个class文件开头的4个字节称为“魔数”,即图中的“CA FE BA BE”,(一个16进制数代表4位,两个就是8位,刚好是一个字节),这个魔数的作用就是:确定这个文件是否是一个能被JVM接受的class文件。

2.紧接着魔数的4个字节是Class文件的版本号,其中5、6两个字节是次版本号(0x0000),7和8两个字节是主版本号(0x0035),也即10进制中的53,代表这个文件是能被jdk1.8或以上版本虚拟机执行的class文件。

3.再往后,就是常量池的入口常量池可以理解成class文件中的资源仓库。在java中有三种常量池:String常量池、运行时常量池和class常量池。而我们这里讲的就是class常量池,class常量池主要存放字面量和符号引用,由于不同class文件常量池中的常量数是不同的,所以会有两个字节表示常量池计数器,记录了常量的个数。这里是001E,是十进制中的30,表示有29项常量(第0项常量是空出来的)。紧接着后面的0A,是常量池第一项常量的标志位,属于CONSTANT_Methodref_info类型,代表类中方法的符号引用。其后的16进制数以此类推。

4.在常量池结束以后的两个字节代表访问标志,用于识别一些类或接口层次的访问信息。比如,这个class是类还是接口,是否定义成public等。

5.访问标志后面是类索引、父类索引和接口索引集合,class文件由这三项数据来确定这个类的继承关系。类索引确定这个类的全限定名,父类索引确定这个类的父类的全限定名,由于Object是所有java类的父类,所以除了Object之外,任何类的父类索引都不为0.接口索引集合描述这个类实现了哪些接口。

6.而在后面的是字段表集合、方法表集合和属性表集合,此处就不再做说明,如果有对这些感兴趣的,可以去查阅资料书,推荐周志明的《深入理解java虚拟机》(非打广告)



作者:封心_SH
链接:https://www.jianshu.com/p/48f62a5c69c8


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
移动开发工程师
手记
粉丝
45
获赞与收藏
144

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消