比如我在一个方法体中声明了一个基本类型的局部变量:
int a = 1;
我知道变量名和变量类型是保存在栈中的局部变量表中,可是局部变量表结构并没有字面量成员,那a的值1是存放在哪里?
反编译后的字节码指令是:
0: iconst_1
1: istore_2
第一条指令是将常量1压入操作数栈,这个我能理解。
可是第二条指令说将操作数栈的栈顶元素弹出推入局部变量表中Slot=2的位置,可是操作数栈只有常数,这就引出了两个问题:
1. 局部变量表的变量名是哪来的?
2. 局部变量表并不保存局部变量的值,那这个值是储存在哪里的?
字节码指令iload_2
的意思是拿出局部变量表中位置为2的变量,应该是拿值出来吧,可是这个值局部变量表并没有存啊…
经过百度,我自己对这两个问题的理解:
1. 局部变量表的长度在编译期时就确定,那是不是方法中所有的局部变量就已经在局部变量表生成的时候加了进去。如果这么理解是正确的话,那么局部变量表是什么时候生成的?
2. 局部变量表中Slot为2的位置储存了a这个变量,这个2是一个类似于地址索引之类的东西,指向变量a的地址空间,而操作数栈是根据这个索引将变量的值保存在这个地址上的。
但是我感觉这么解释有点太牵强了,有木有大神帮我解答一下……