亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

【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 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
移動開發工程師
手記
粉絲
46
獲贊與收藏
145

關注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消