一, javap实际应用
这个是在分析++i 和 i++的区别时用到的, 都知道一个先加1再做别的事情, 另一个与之相反, 至于为什么这样, 只有具体分析对应的字节码了。
1, javap -c 处理该java类,却提示找不到类
cmd --> 进入JavapTest.java所在的位置 -->javap -c JavapTest
解决办法:
先运行指令: javac JavapTest.java 生成对应的class文件, 之后再进行javap -c操作
2, ++j和j++对应字节码分析
(这个是在公众号《码农翻身》的星球里看到的,来自刘大大的分析,直接粘过来用了)
我们把程序简化成这样:
int j = 0;
j = j ++;
System.out.println(j);
然后用javap去处理,得到结果如下:
0: iconst_0 //把数值0 放到栈顶
1: istore_1 //把栈顶的值(0)放到局部变量表中index为1的地方(表示变量j)
2: iload_1 //把局部变量表中index为1的变量(j)放到栈顶
3: iinc 1, 1 //把局部变量表中index为1的变量增加1, 现在变量j 为1
6: istore_1 //把栈顶的值(0)保存到放到局部变量表中index为1的地方(此时j又变成了0)
7: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1 // j 还是0
11: invokevirtual #22 // Method java/io/PrintStream.println:(I)V
14: return
可见字节码中只是对局部变量表做了加一操作,栈顶的值没有变, 等把栈顶的值写回局部变量表,就把加过1的值覆盖掉了。 所以j一直是0 。
如果把代码改成这样:
int j = 0;
j = ++j;
System.out.println(j);
对应的字节码是:
0: iconst_0 //把数值0放到栈顶
1: istore_1 //把栈顶的值弹出,放到局部变量表为1的地方(j=0)
2: iinc 1, 1 //把局部变量表中的j 增加1
5: iload_1 // 把j 放到栈顶
6: istore_1 // 把栈顶的值弹出,放到局部变量表为1的地方(j=1)
7: getstatic #16 // Field java/lang/System.out:Ljava/io/PrintStream;
10: iload_1
11: invokevirtual #22 // Method java/io/PrintStream.println:(I)V
14: return