虚拟机执行子系统
一.class类文件结构
使用HexView查看
u4: magic cafebebe(魔术)
u2: minor_version 0x00
u2: major_version 0x34
u2: constant_pool_count oxDA(-1即为常量数量)
cp_info: constant_pool
...
常量池 constant_pool
存放两大类常量:
字面量: 如文本字符,什么为final的常量值
符号引用:
1.类和接口的权限名
2.字段的名称和描述符
3.方法的名称和描述符
java代码在javac编译的时候,并不像C和C++那么样有连接,而是在jvm加载Class文件的时候进行动态的连接
,也就是说Class文件不会保存各个方法,字段的最终内存信息,因为这些字段,方法的符号引用不经过晚期转换的话
无法得到真正的内存入口地址,也就无法直接被虚拟机使用,当虚拟机运行的时候,需要从常量池,获得对应的符号引用,
再在类创建时或运行时解析,翻译到具体的内存地址中
常量值的项目类型
类型 | 标志 | 描述 |
---|---|---|
CONSTANT_Utf8_info | 1 | utf8编码的字符串 |
CONSTANT_Integer_info | 3 | 整型字面量 |
CONSTANT_Float_info | 4 | |
CONSTANT_Long_info | 5 | |
CONSTANT_Double_info | 6 | |
CONSTANT_Class_info | 7 | 类或接口引用 |
CONSTANT_String_info | 8 | |
CONSTANT_Fieldref_info | 9 | 字段的符号引用 |
CONSTANT_Methodref_info | 10 | 方法的符号引用 |
CONSTANT_InterfaceMethodref_info | 11 | 接口方法的的符号引用 |
CONSTANT_NameAndType_info | 12 | 字段或符号的部分符号引用 |
CONSTANT_MethodHandle_info | 15 | 方法句柄 |
CONSTANT_MethodType_info | 16 | 表示方法类型 |
CONSTANT_InvorkDynamicg_info | 18 | 动态方法的执行点 |