我最近一直在学习java字节码,而且我已经理解了大部分内容,但我对如何计算局部变量计数感到困惑。我认为它只是局部变量的总和,但是这个代码在查看字节码时生成了1个局部变量
public int testFail()
{
return 1;
}
但我认为它应该是零局部变量,因为没有定义局部变量。
此外,此方法还会生成一个局部变量,但它具有比前一个示例更多的局部变量。
最后这个方法
public static int testFail(int a, int b)
{
return a+b;
}
在字节码中生成两个局部变量。
public static int testFail(int a)
{
return a;
}
答案 0 :(得分:1)
非静态方法使用this
的局部变量槽。另一个复杂因素是long
和double
每个计数为2。此外,根据您的编译器和设置,您可能看不到源代码中的局部变量和字节代码中的局部变量之间的一对一映射。例如,如果省略调试信息,编译器可能会消除不必要的局部变量。
编辑:
我记得:编译器也可能重用本地变量槽。例如,给定此代码:
public static void test() {
for(int i = 0; i < 100; i++) {
...
}
for(int j = 0; j < 100; j++) {
}
}
相同的广告位可以用于i
和j
,因为它们的范围不会重叠。
答案 1 :(得分:0)
第一个具有局部变量的原因是因为它是非静态方法,因此存在隐式this
参数。