这是 java 代码
public void test1(int j) {
synchronized (this) {
for (int i = 0; i < 10; i++) {
log.info("test1 {} - {}", j, i);
}
}
}
该方法 javap 反编译后的前面部分的指令截图
该方法 javap 反编译后的本地变量表如下:
我的问题一:slot 是本地变量表的索引吧。那一开始的本地变量表就如下图所示吗?没有 slot=2,难道是入参 j 占了 2 个位置?
第一条指令 aload_0 就是把本地变量表中 slot=0 的引用类型压入操作数栈。
我的第二个问题是,this 压入操作数栈后,本地变量表也就是 slot=0 的这个位置还会有 this 吗?
dup 指令复制操作数栈顶的 this,再压入到栈顶,也就是此时操作数栈有 2 个 this
我的第三个问题是:astore_3 这个指令的意思是将栈顶引用类型存入本第变量表的 slot=3 位置吗? slot=3 已经有 int i 了阿
1
BBCCBB 2019-04-12 22:07:11 +08:00
问题二:this 压入栈后,slot=0 这个位置还有 this。
aload_0 只是加载了 0 号位置的变量到操作数栈里,局部变量表里的数据依然在,只要 0 号位置没被覆盖,那就还是 this 问题三:a_store3 是将操作数栈顶的元素写到 3 号槽的位置,iconst_0 只是加载一个常量 0 到操作数栈顶,并没有放入局部变量表。 看了大半年了,好多都忘了,如有错误,请告诉我 |
2
BBCCBB 2019-04-12 22:20:04 +08:00
问题一:this 占第 0 个位置,i 占第 1 个位置,后面都是空着的。
|
3
zealot0630 2019-04-12 22:22:20 +08:00 via Android
我猜的话,2 那个位置被用来存放函数返回地址了。可以试试反编译其他函数,看看是不是所有函数的参数后第一个 slot 都无法使用
|