之前已经得到了class文件的二进制码,那么jvm是以什么格式去解析这份二进制码的呢?
class文件是以以下的格式进行数据类型的存放:
classFile {
u4 magic;
u2 minor_version;
u2 major_version;
u4 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];
}
java虚拟机规范定义了u1,u2和u4三种数据类型,来表示1,2和4字节无符号整数。
先有个大体的概念:
1.前4个字节,魔数~ (0Xca fe ba be),它唯一的作用是 确定这个文件是否为一个被虚拟机接受的Class文件。
2.接下来的第5个和第6个 字节是次版本号 第7和第8个字节是主版本号 。
3.常量池个数,以及常量池的信息(信息较多,下一章单独再分析)
4.访问标志
5.类索引,父类索引与接口索引集合
6.字段表集合
7.方法表集合
8.属性表集合
对于 constant_pool, interfaces , fields, methods ,attributes可以暂时理解成一种特殊的bean,其中还有很多的特定的字段。具体的结果,之后再逐个分析。接下来我们的任务就是讲class二进制根据这个大体结构,分析一遍先~