理解为简单的java类生成的字节码

时间:2016-03-23 00:32:00

标签: java bytecode jvm-bytecode

我正在关注这个blog来研究java到字节码&我为这个SimpleClass生成了字节码。

public class SimpleClass {

    public int simpleF = 5;


}

我理解字节码位置如下

  • 0代表'这个'
  • 1用于调用超类的构造函数 宾语。
  • 4 - ?
  • 5 for value 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
}

2 个答案:

答案 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