使用javap -v 反编译下面操作代码
public void test(){
int i=10;
i=i++;
System.out.println(i);
int j=10;
j=++j;
System.out.println(j);
}
i++、++i原理
public void a();
descriptor: ()V
flags: ACC_PUBLIC
Code:
stack=2, locals=3, args_size=1
0: bipush 10 // 将10压入操作数栈
2: istore_1 // 将操作数栈中的10保存到局部变量表位置为1的地方
3: iload_1 // 将局部变量表位置为1的值取出到操作数栈(10)
4: iinc 1, 1 // 将局部变量表位置为1的值自增1 (局部变量表中i=11)
7: istore_1 // 将操作数栈中的10保存到局部变量表位置为1的地方 操作数栈中i=10覆盖局部变量表i=11
8: getstatic #2
11: iload_1 // 将局部变量表位置为1的值取出到操作数栈(10)
12: invokevirtual #3
15: bipush 10 // 将10压入操作数栈
17: istore_2 // 将操作数栈中的10保存到局部变量表位置为2的地方
18: iinc 2, 1 // 将局部变量表位置为2的值自增1 (局部变量表中i=11)
21: iload_2 // 将局部变量表位置为1的值取出到操作数栈(11)
22: istore_2 // 将操作数栈中的11保存到局部变量表位置为2的地方 操作数栈中i=11覆盖局部变量表i=11
23: getstatic #2
26: iload_2 // 将局部变量表位置为2的值取出到操作数栈(11)
27: invokevirtual #3
30: return
LineNumberTable:
line 11: 0
line 12: 3
line 13: 8
line 14: 15
line 15: 18
line 16: 23
line 17: 30
LocalVariableTable:
Start Length Slot Name Signature
0 31 0 this Lcom/yxd/context/TestService;
3 28 1 i I
18 13 2 j I
RuntimeVisibleAnnotations:
0: #26()