了解为简单 java class 生成的字节码
Understanding bytecode generated for a simple java class
我正在关注此 blog 来研究 java 字节码,并且我已经为这个 SimpleClass 生成了字节码。
public class SimpleClass {
public int simpleF = 5;
}
我理解的字节码位置如下
- 0 用于 'this'
- 1 用于调用超类的构造函数
目的。
- 4——?
- 5 表示值 5
- 6 从堆栈中弹出并将 5 分配给
变量。
但是我不明白aload_0
在位置4和它的目的?
// 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.
的语句中将当前 class 的引用压入堆栈
[this.]simpleF=5
来自http://cs.au.dk/~mis/dOvs/jvmspec/ref-putfield.html
putfield sets the value of the field identified by <field-spec>
in
objectref (a reference to an object) to the single or double word
value on the operand stack.
为了让 JVM 执行几乎任何它必须将东西压入执行栈的东西,aload_0 用于将对象从局部变量数组(位置 0)加载到执行栈,例如方法位置0 总是引用 this,这是对当前对象的引用。
可以在本文中找到更多信息:
http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html
我正在关注此 blog 来研究 java 字节码,并且我已经为这个 SimpleClass 生成了字节码。
public class SimpleClass {
public int simpleF = 5;
}
我理解的字节码位置如下
- 0 用于 'this'
- 1 用于调用超类的构造函数 目的。
- 4——?
- 5 表示值 5
- 6 从堆栈中弹出并将 5 分配给 变量。
但是我不明白aload_0
在位置4和它的目的?
// 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 sets the value of the field identified by
<field-spec>
in objectref (a reference to an object) to the single or double word value on the operand stack.
为了让 JVM 执行几乎任何它必须将东西压入执行栈的东西,aload_0 用于将对象从局部变量数组(位置 0)加载到执行栈,例如方法位置0 总是引用 this,这是对当前对象的引用。
可以在本文中找到更多信息: http://blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html