Class文件中采用一种类似于C语言的结构体的伪结构来存储数据,结构中只有两种数据类型
1 无符号数:基本数据类型,u1,u2,u3,u4来代表1个字节,2个字节,4个字节,8个字节的无符号数。
2 表:由多个无符号数或者其他表构成的复合数据类型,名字以“_info”为结尾。
Class文件格式(《深入理解Java虚拟机》周志华)
类型 | 名称 | 数量 |
u4 | magic | 1 |
u2 | minor_version | 1 |
u2 | major_version | 1 |
u2 | constant_pool_count | 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 | attribute_count | 1 |
attribute_info | attributes | attributes_count |
constant_pool:常量池
主要存放字面量和符号引用。
字面量:文本字符串,被声明为final的常量值。
符号引用:被模块导出或开放的包,类和接口的全限定名,字段的名称和描述符,方法的名称和描述符,方法句柄和方法类型,动态调用点和动态常量。
当虚拟机做类加载时,将会从常量池获得对应的符号引用,再在类创建时或运行时解析、翻译到具体的内存地址之中。
常量池中的每一项常量都是一个表,截止至JDK13,共有17种不同类型的常量。
javap分析JvmTest.class
javap -verbose JvmTest
字段表(feilds):用于描述接口或者类中声明的变量
方法表(methods):
属性表(attributes):Class文件,字段表,方法表都可以携带自己的属性表集合
属性表:Code属性,出现在方法表的属性集合之中。
示例代码:
public class JvmTest {
private int m;
public int inc() {
return m+1;
}
}