我正在关注这个博客来研究java到字节码,我已经为这个SimpleClass生成了字节码。
public class SimpleClass {
public int simpleF = 5;
}
我了解字节码位置如下
- 0 代表"这个"
- 1 用于调用超类的构造函数对象。
- 4 -- ? 5
- 表示值 5
- 6 从堆栈中弹出并分配 5 到变量。
但我不明白位置 4 的aload_0
及其目的?
// Compiled from SimpleClass.java (version 1.6 : 50.0, super bit)
public class SimpleClass {
// Field descriptor #6 I
public int simpleF;
// Method descriptor #8 ()V
// Stack: 2, Locals: 1
public SimpleClass();
0 aload_0 [this]
1 invokespecial java.lang.Object() [10]
4 aload_0 [this]
5 iconst_5
6 putfield SimpleClass.simpleF : int [12]
9 return
Line numbers:
[pc: 0, line: 2]
[pc: 4, line: 4]
[pc: 9, line: 2]
Local variable table:
[pc: 0, pc: 10] local: this index: 0 type: SimpleClass
}
aload_0
可以在堆栈中推送对当前类的引用,该语句将本地非静态字段simpleF
设置为 5。
[this.]simpleF=5
从 http://cs.au.dk/~mis/dOvs/jvmspec/ref-putfield.html
putfield 设置由
<field-spec>
标识的字段的值 对象引用(对对象的引用)到单个或双字 操作数堆栈上的值。
为了让JVM执行几乎任何东西,它必须将东西推入执行堆栈,aload_0用于将对象从局部变量数组(位置0)加载到执行堆栈,例如方法位置0总是引用当前对象的引用。
更多信息可以在本文中找到:http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html