第3讲 字节码层面分析 class 类文件结构

第3讲 字节码层面分析 class 类文件结构

拉勾教育:https://kaiwu.lagou.com/course/courseInfo.htm

这一讲主要介绍class文件的内部结构,内容相对枯燥但并不难。据说这个东西很重要,不过就目前我所涉及的知识面来讲,在实际应用中不大可能会去通过分析class文件来理解一个类的作用,或者进一步去修改class文件。即使要操作class文件也会有工具去处理的,人工去分析的话得要累死。我觉得这节课的意义是了解一下class文件的结构,不至于说到class文件心里就没底。

一、概念

Class文件是一组以8位字节为基础单位的二进制流,当遇到需要8位字节以上空间的数据项时,则会按照高位在前的方式分隔成若干个8位字节进行存储。

用记事本打开它,你将看到一堆乱码。这个谁也看不懂,不过可以用16进制编辑器打开它,打开之后就像这样
在这里插入图片描述
所有class文件都像这样,只是行数有多有少。这样子看起来好像没那么慌了,起码我认得里面的数字和字母,这个我小学就学过了。可是这些字母和数字组合在一起代表了什么呢?这个嘛。。。难道是什么秘籍使用的暗号??没错,就是一些暗号,要是你是内行人,估计查查资料能明白其中的内容代表什么意思,如果是外行,那跟看到前面的乱码一样看不出是什么意思。

二、class文件结构

要看明白这些暗号,就要了解class的内部结构
在这里插入图片描述

这个就class文件的结构,普通人能看明白的。

对应上面的16进制数,如下:
在这里插入图片描述

在 class 文件开头的四个字节是 class 文件的魔数,它是一个固定的值–0XCAFEBABE。 魔数是 class 文件的标志,也就是说它是判断一个文件是不是 class 格式文件的标准, 如果开头四个字节不是 0XCAFEBABE, 那么就说明它不是 class 文件, 不能被 JVM 识别或加载。

紧跟在魔数后面的两个字节代表当前 class 文件的版本号。前两个字节 0000 代表次版本号(minor_version),后两个字节 0034 是主版本号(major_version),对应的十进制值为 52,也就是说当前 class 文件的主版本号为 52,次版本号为 0。所以综合版本号是 52.0,也就是 jdk1.8.0

这样可以推测,这个文件的内容分成了8块,并按照上面的顺序排列在一起的。具体到每一块对应哪些内容,这就涉及到规则了。
在这里插入图片描述

这张表规定了每一块的数据长度及数据类型,有的块的长度是固定的,有的块的长度是可变的,可变的数据长度在数据类型里有指定具体的长度。

再更详细的分析就要对着表一点一点去理解。在课程中有详细的介绍。




由于水平有限,如果文中存在错误之处,请大家批评指正,欢迎大家一起来分享、探讨!

博客:http://blog.csdn.net/MingHuang2017

GitHub:https://github.com/MingHuang1024

Email: [email protected]

ngHuang1024)

Email: [email protected]

微信:724360018

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章