class文件是一组以8位字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑地排列在class文件中,中间没有分隔符。
class文件格式:
类型 | 名称 | 数量 | 描述 |
---|---|---|---|
u4 | magic | 1 | 魔数 |
u2 | minor_version | 1 | 次版本号 |
u2 | major_version | 1 | 主版本号 |
u2 | constant_pool_count | 1 | 常量池容量(计数从1开始) |
cp_info | constant_pool | constant_pool_count-1 | 常量 |
u2 | access_flags | 1 | 访问标志 |
u2 | this_class | 1 | 类索引 |
u2 | super_class | 1 | 父类索引 |
u2 | interfaces_count | 1 | 接口索引集合长度 |
u2 | interfaces | interfaces_count | 接口索引集合 |
u2 | fields_count | 1 | 字段表长度 |
field_info | fields | fields_count | 字段表集合 |
u2 | methods_count | 1 | 方法表长度 |
method_info | methods | methods_count | 方法表集合 |
u2 | attributes_count | 1 | 属性表长度 |
attribute_info | attributes | attributes_count | 属性表集合 |
1、魔数:0xCAFEBABE
2、版本号:版本号向下兼容,低版本JDK不能运行高版本的class文件。
3、常量池:常量池中主要存放两类常量:字面量和符号引用。
字面量包括文本字符串,声明为final的常量值等。
符号引用包括:类和接口的全限定名,字段的名称和描述符,方法的名称和描述符。
4、访问标记:用于识别一些类或者接口层次的访问信息。
5、类索引、父类索引与接口索引:用于确定类、父类、接口的全限定名。
6、字段表:用于描述接口或者类中声明的变量。
7、方法表:用于描述方法。
8、属性表:用于描述专有属性。