类文件结构
Class的结构不像xml等描述语言,由于它没有任何分隔符号,所以无论是顺序还是数量,都被严格限定,字节含义和长度先后顺序等,都不允许改变。
1 魔数
每个class文件的头4个字节称为魔数,它的唯一作用是用于确定这个文件是否为一个能被虚拟机接受的class文件。(不用扩展名是因为扩展名可以被随意改动,不安全)。class文件的魔数为:0xCAFEBABE;
紧接着魔数的4个字节是存储的class文件的版本号,第5和6个字节是次版本号,7,8个字节是主版本号。
后续讲解以以下代码为例:
public class TestClass {
private int m;
public int inc(){
return m + 1;
}
}
2 常量池
常量池是class文件结构中与其他项目关联最多的数据类型,也是占用class文件空间最大的数据项目之一。
常量池中主要存放两大类常量:字面量和符号引用。
常量池中的每一项常量都是一个表,共有11种结构各不相同的表结构数据,这11种表开始的第一位是一个u1类型的标志位,代表当前这个常量属于哪种常量类型。
其他同理,常量表如下:
3 访问标志
4 类索引、父类索引与接口索引集合
5 字段表集合
字段表(field_info)用于描述接口或类中声明的变量。字段(field)包括了类级变量或实例级变量。但不包括在方法内部声明的变量。
全限定名和简单名称,描述符的区别:
字段表(field_info)用来描述接口或类中声明的变量,字段包括类级别变量以及实例级别变量。但不包括方法内部声明的局部变量。
6 方法表集合
7 属性表
太难了啊啊啊啊啊啊啊啊
以code属性为例,其他属性先不涉猎;
太乱了未完待续…
来源:CSDN
作者:carrot_yang
链接:https://blog.csdn.net/weixin_40824616/article/details/103695086