读class文件是个漫长的过程,但阅读并不需要你手写二进制代码那么恐怖,只是重在理解,能够更好的理解虚拟机执行引擎,也很好的提升java基础。
阅读class文件分为两篇,下面是另一篇的链接。
带你阅读class文件,认识class文件中的常量池
访问标志
class文件常量池之后,继而是访问标志
,即这个类的public、final、interface、abstract等访问信息。(下表不全)
例如下图中,橙色两个字节就是访问标志,代表0x0021,表示ACC_PUBLIC,ACC_SUPER
类索引与父类索引
访问标志结束以后,类索引和父类索引分别有两个字节
,一个指向当前类名,一个指向父类。
绿色代表类索引,褐色代表父类索引。(示意图与jclasslib打开的不是一个文件)索引会先找到常量池中的CONSTANT_Class_info然后再找到CONSTANT_Utf8_info,类名信息就存放在CONSTANT_Utf8_info中。
举例
我们从7的CONSTANT_Class_info找到了33的CONSTANT_Utf8_info,里面存放着类名信息。
父类索引同理,该类的父类是Object,也就是没有其他类。
以上这些信息都可以用jclasslib查看
接口索引
在java语言中,接口是可以多实现的,所以这里需要引入计数器
(计数器我们会经常用到)来统计接口索引的数量,计数器含有两个字节,下图中黄色代表实现了0个接口。那么也就没有接口索引。如果有的话寻找方式与上一小节中相同。
字段表
字段表描述接口或类中的变量,但不包括方法中的局部变量。java中,字段可以有多个,那么我们又需要引入什么? 字段计数器,这里我们就不用这么详细了吧,直接开始读class文件。
首先字段表结构如下:
下图中不同颜色的含义已经注明了。
这里我们有一个字段,如果有多个那么就会有多个字段表。
方法表
在方法表之前首先也是计数器,然后方法表结构如下
开始阅读:
属性表
class文件、字段表、方法表都可以携带属性表。属性名称有很多,不同的属性也有不同的结构
,下面是属性的通用结构。
属性类型举例:
code | 方法表 |
---|---|
ConstantValue | 字段表 |
Exceptions | 方法表 |
InnerClasses | 类文件 |
等等,还有很多,都有各自的结构。
阅读class文件:
总结
当然,以上是最原始的办法,但也是帮助我们认知的一个途径,在今后使用jclasslib即可,经过学习我们也更能深入理解该工具的各个项的含义。