0

鉴于说明istore_<n>及其文档

n 必须是当前帧的局部变量数组的索引(第 2.6 节)。

它没有指定它从哪个索引开始。我假设为 0。对于给定的 istore 操作,它应该加一。

给定一个简单的类:

public class TestingStuff {
    public static void main(String[] args) {
        int a = 11;
        int b = 12;

    }

    public static void test() {
        int c = 13;
        int d = 14;
    }
}

我希望这两种方法有不同的框架。那么这应该意味着存储的指令aandb将是istore_0and istore_1。以及用于存储c和的相同索引d。但由于某种原因,main 方法中的索引从1. 这似乎总是如此。但我找不到任何有关原因的信息。

javap的输出:

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=3, args_size=1
         0: bipush        11
         2: istore_1
         3: bipush        12
         5: istore_2
         6: return

  public static void test();
    descriptor: ()V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=2, args_size=0
         0: bipush        13
         2: istore_0
         3: bipush        14
         5: istore_1
         6: return

是这样吗?如果是这样,为什么?

4

1 回答 1

4

静态方法的参数作为从位置 0 开始的局部变量传入。因此,对于mainargs数组位于位置 0 的局部变量中。编译执行某些操作的代码args应该证明这一点,尽管我没有编译器便利。

(例如方法,this位于位置 0,然后其余参数从位置 1 开始。)

有关详细信息,请参阅第 2.6.1 节

于 2019-10-15T21:33:37.500 回答