1

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

public class SimpleClass {

    public int simpleF = 5;


}

我理解字节码位置如下

  • 0 代表“这个”
  • 1 用于调用超类 Object 的构造函数。
  • 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
}
4

2 回答 2

2

aload_0是否将在将本地非静态字段设置simpleF为 5 的语句中的当前类的引用推入堆栈。

[this.]simpleF=5

来自http://cs.au.dk/~mis/dOvs/jvmspec/ref-putfield.html

putfield 将由<field-spec>in objectref(对对象的引用)标识的字段的值设置为操作数堆栈上的单字或双字值。

于 2016-03-23T00:54:11.810 回答
0

为了让 JVM 执行几乎任何它必须将东西推入执行堆栈,aload_0 用于将对象从局部变量数组(位置 0)加载到执行堆栈,例如位置 0 始终引用 this 的实例方法,这是一个引用到当前对象。

更多信息可以在这篇文章中找到:http: //blog.jamesdbloom.com/JavaCodeToByteCode_PartOne.html

于 2016-03-23T13:04:10.323 回答