- ? 在遇到一些小問題的時候我們經常會使用Javap反編譯取得字節碼來分析,雖然Javap能完成這個工作,但是有兩個缺點,一方面操作麻煩,需要很多步驟,一方面沒有文檔注釋,對新手來說看起字節碼來比較麻煩。??
- ?????這里推薦一個工具,Bytecode?Outline?.它是Eclipse的插件,可以把當前的正在編輯Java的文件或者 class 文件直接顯示出其相應的字節碼出來,而且可以進行兩個Java文件的字節碼比較或者兩個 class 文件的字節碼比較或一個Java文件與一個 class 文件進行字節碼的比較。??
- 安裝方法:和其它插件類似,可以拷貝到plugin下也可以link方式安裝??
- 下載地址:http: //forge.objectweb.org/projects/asm/ ??
- 注意:因為Bytecode?Outline的運行需要ASM?Framework,所以也要下載這個文件??
- 對應的兩個文件名為:??
- org.objectweb.asm_2. 2.2 .jar??
- de.loskutov.BytecodeOutline_2. 1.0 .jar??
- 也可以用update的方式來安裝,好處是可以隨時更新,地址如下:??
- http: //download.forge.objectweb.org/eclipse-update/ ??
- ????試了一下,不知道什么原因,第一種方法失敗,只有使用第二種方法了,不過也很方便,在eclipse下安裝.點擊help->software?update->find?and?install...?后面的就按一步步安裝就可以了.??
- ??
- ????安裝完了,windows-->showview-->other-->點開Java的樹-->選擇Bytecode?,同樣的方法選擇Bytecode?Reference?.下面看一個典型的String的反編譯例子:??
- public ? static ? void ?main(String[]?args){??
- ???String?m= "mango" ;??
- ???String?s= "abc" +m+ "def" + 47 ;??
- ???System.out.println(s);??
- }??
- 反編譯后:??
- //?access?flags?9 ??
- public ? static ?main(String[])?:? void ??
- ???L0?( 0 )??
- ????LINENUMBER? 6 ?L0??
- ????LDC? "mango" ??
- ????ASTORE? 1 :?m??
- ???L1?( 3 )??
- ????LINENUMBER? 7 ?L1??
- ????NEW?StringBuilder??
- ????DUP??
- ????LDC? "abc" ??
- ????INVOKESPECIAL?StringBuilder.<init>(String)?:? void ??
- ????ALOAD? 1 :?m??
- ????INVOKEVIRTUAL?StringBuilder.append(String)?:?StringBuilder??
- ????LDC? "def" ??
- ????INVOKEVIRTUAL?StringBuilder.append(String)?:?StringBuilder??
- ????BIPUSH? 47 ??
- ????INVOKEVIRTUAL?StringBuilder.append( int )?:?StringBuilder??
- ????INVOKEVIRTUAL?StringBuilder.toString()?:?String??
- ????ASTORE? 2 :?s??
- ???L2?( 16 )??
- ????LINENUMBER? 8 ?L2??
- ????GETSTATIC?System.out?:?PrintStream??
- ????ALOAD? 2 :?s??
- ????INVOKEVIRTUAL?PrintStream.println(String)?:? void ??
- ???L3?( 20 )??
- ????LINENUMBER? 9 ?L3??
- ????RETURN??
- ???L4?( 22 )??
- ????LOCALVARIABLE?args?String[]?L0?L4? 0 ??
- ????LOCALVARIABLE?m?String?L1?L4? 1 ??
- ????LOCALVARIABLE?s?String?L2?L4? 2 ??
- ????MAXSTACK?=? 3 ??
- ????MAXLOCALS?=? 3 ??
- ??
- ??
- 通過反編譯后的字節碼,我們就會更加深刻理解String中的 "+" 操作過程了.??
-
相信有了它,對以后的學習一定會有很大的幫助~ ?
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
