类文件结构这章内容很多,知识点也很散,此处总结以我感觉比较重要的语句记录为主。
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
不再列举,讲了也记不住,来一个例子:如下所示:
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的两个数相加,并将结果放在栈顶