给定指令istore_<n>
及其documentation:
n必须是当前帧的局部变量数组的索引(第2.6节)。
它没有指定从哪个索引开始。我假设为0。对于给定的istore操作,它应该增加1。
给定一个简单的类:
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;
}
}
我希望这两种方法具有不同的框架。然后,这应该意味着用于存储
a
和b
的指令将是istore_0
和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
是这样吗如果是这样,为什么?
最佳答案
静态方法的参数从位置0开始作为局部变量传入。因此,对于main
,args
数组位于位置0的局部变量中。对args
进行处理的代码应证明,尽管我没有编译器。
(对于实例方法,this
在位置0,然后其余参数从位置1开始。)
有关详细信息,请参见section 2.6.1。