深入理解Java虚拟机4~类文件结构

时间:2021-11-09 09:53:20

类文件结构这章内容很多,知识点也很散,此处总结以我感觉比较重要的语句记录为主。

1、Java虚拟机不和包括java在内的任何语言绑定,它只与Class文件,这种特定的二进制文件格式所关联。多种语言都可以把代码编译为Class文件。

2、Class文件格式:

类型 名称 解释
u4 magic 魔数,0xCAFEBABE,固定值
u2 minor_version 次版本号
u2 major_version 主版本号
u2 constant_pool_count 常量池容量计数值,从1开始,0特有用处
cp_info constant_pool 常量池,从1开始
u2 access_flags 访问标志:类或接口的访问信息
u2 this_class 类索引
u2 super_class 父类索引
u2 interfaces_count 接口计数器
u2 interfaces 接口索引
u2 fields_count  
field_info fields 字段
u2 methods_count  
method_info methods 方法
u2 attribute_count 1
attribute_info attributes 属性

3、字节码指令

加载和存储指令:

iload    iload_<n>   :将一个局部变量加载到操作栈,i代表int,其他类型与之类似,只有首字母不同。

istore  istore_<n>   :将一个数值从操作数栈存储到局部变量表,i代表int,其他类型与之类似,只有首字母不同。

iconst_<i>    lconst_<l>    :将一个常量加载到操作数栈。

运算指令:对两个操作数栈上的值进行某种特定运算,并把结果重新存入到操作栈顶。

iadd    isub    imul  idiv   irem   ineg   ishl   ior   iand   ixor   iinc

不再列举,讲了也记不住,来一个例子:如下所示:

深入理解Java虚拟机4~类文件结构



istore_0:将栈顶元素存储到局部变量表slot0中

istore_1:将栈顶元素存储到局部变量表slot1中

istore_2:将栈顶元素存储到局部变量表slot2中

iload_0:将局部变量slot0的元素入栈

iload_1:将局部变量slot1的元素入栈

iconst_1:将常量1加载到操作数栈

iconst_2:将常量2加载到操作数栈

iadd:将iload_0和iload_1的两个数相加,并将结果放在栈顶