我正在关注这个blog来研究java到字节码&我为这个SimpleClass生成了字节码。
public class SimpleClass {
public int simpleF = 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
}
答案 0 :(得分:1)
aload_0
可以在堆栈中引用将本地非静态字段simpleF
设置为5的语句中的当前类。
[this.]simpleF=5
来自http://cs.au.dk/~mis/dOvs/jvmspec/ref-putfield.html
putfield设置
<field-spec>
标识的字段的值 objectref(对象的引用)到单个或双个单词 操作数堆栈上的值。
答案 1 :(得分:0)
为了让JVM执行几乎任何东西,它必须将事物推入执行堆栈,aload_0用于将对象从局部变量数组(位置0)加载到执行堆栈,例如方法位置0总是引用这个是对当前对象的引用。
可以在本文中找到更多信息: http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html