原始博客的地址:

https://lyldalek.notion.site/JVM-0x2-d51f2a9d315d4df7904a32474bb510c5

该项目的地址:

https://github.com/aprz512/write-your-own-jvm

认识class文件

上一篇我们通过搜索 classpath 下的文件,将一个 class 文件转换为了二进制数据。

这些二进制数据是有这固定的格式的,具体可看官方文档,下面贴一个 java7 的 class 文件格式:

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html

快速熟悉 class 文件也是有套路的,一般的这种文件格式的设计都会采用套娃的方式:

Untitled

一段区域储存一些重复的数据,另一段区域只用储存数据对应的索引。当然还可以嵌套的更深。

我们先来看看官方是如何定义 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个部分:

常量池介绍