javap -c 找不到類
一, 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