局部变量区与操作数栈字节码实例

局部变量区与操作数栈字节码实例

局部变量区与操作数栈字节码实例 #

除 invokedynamic 外,其他的方法调用指令所消耗的操作数栈元素是根据调用类型以及目标方法描述符来确定的。在进行方法调用之前,程序需要依次压入调用者(invokestatic 不需要),以及各个参数。

public int neg(int i) {
  return -i;
}
public int foo(int i) {
  return neg(neg(i));
}
// foo方法对应的字节码如下:foo方法对应的字节码如下:
public int foo(int i);
  0  aload_0 [this]
  1  aload_0 [this]
  2  iload_1 [i]
  3  invokevirtual FooTest.neg(int) : int [25]
  6  invokevirtual FooTest.neg(int) : int [25]
  9  ireturn

以上面这段代码为例,当调用 foo(2) 时,每条指令执行前后局部变量数组空间以及操作数栈的分布如下所示:

数组相关指令,包括新建基本类型数组的 newarray,新建引用类型数组的 anewarray,生成多维数组的 multianewarray,以及求数组长度的 arraylength。另外,它还包括数组的加载指令以及存储指令。这些指令是区分类型的。例如, int 数组的加载指令为 iaload,存储指令为 iastore。

Viewpoint #

From #

19 | Java字节码(基础篇)