1. 程式人生 > >javap -c 找不到類

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