原始博客的地址:
https://lyldalek.notion.site/JVM-0x2-d51f2a9d315d4df7904a32474bb510c5
该项目的地址:
上一篇我们通过搜索 classpath 下的文件,将一个 class 文件转换为了二进制数据。
这些二进制数据是有这固定的格式的,具体可看官方文档,下面贴一个 java7 的 class 文件格式:
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html
快速熟悉 class 文件也是有套路的,一般的这种文件格式的设计都会采用套娃的方式:
一段区域储存一些重复的数据,另一段区域只用储存数据对应的索引。当然还可以嵌套的更深。
我们先来看看官方是如何定义 class 文件的:
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
这是伪代码,但是描述的还是非常清晰的,u4
就是4个bytes,把它当作无符号数。cp_info 等又是另外一个结构体。
总体来说,我们主要的工作是解析下面4个部分: