Class文件是什么?
Class文件是8bit的二进制流,数据项按顺序存储在class文件中,相邻项没有间隔,占据多个字节空间的项按照高位在前的顺序分为几个连续的字节存放。
class文件中,可变长度项的大小和长度位于实际数据之前,使得首先读出项的大小,然后读出项的数据
Class文件的内容:
- magic:class文件的前4个字节,用于分辨class文件和非class文件
- minor_version / major_version:魔数的后四位,表明不同的java版本号
- constant_pool.count / constant_pool:版本号的后面是常量池,常量池存储文字字符串,final变量值,类名,方法名等。JVM把常量池组织为入口列表的形式
- access_flag :2字节,表明类或者接口,以及是那种修饰符
- this_class:对常量池的索引,此位置的常量池入口必须为constant_class_info表
- supper_class:在此位置的常量池入口是一个指向超类的全限定名的constant_class_info入口
- interfaces_count / interfaces:存储实现接口的数量以及接口
- fields_count / fields:
- metods_count / methods;从超类或者父接口继承的方法不被计入
- attributes_count / attributes;
特殊字符串
-
全限定名:用斜线代替点
-
简单名称:一个指向类java/lang/Object所属方法String toString()的常量池入口有一个形如"toString"的方法名
-
描述符:
-
常量池
-
方法
-
常量池
-
属性