了解为简单 java class 生成的字节码

Understanding bytecode generated for a simple java class

我正在关注此 blog 来研究 java 字节码,并且我已经为这个 SimpleClass 生成了字节码。

public class SimpleClass {

    public int simpleF = 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