国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > ASM > 正文

用javap 反匯編幫你理解java特性

2019-11-18 13:37:42
字體:
供稿:網(wǎng)友

  用javap 反匯編幫你理解java特性 (使用 javap 深入查看類文件)

作者: Builder.com
使用 javap 深入查看類文件

Java 開發(fā)人員熟悉在一個循環(huán)中使用StringBuffer 來代替串聯(lián) String 對象能獲得最佳性能。然而,多數(shù)開發(fā)人員從來沒有比較兩種方法產(chǎn)生的字節(jié)代碼的區(qū)別。在 Java 開發(fā)工具包(JDK)中有一個叫做 javap 的工具可以告訴你為什么這樣做可以獲得最佳性能。



Javap 將一個類和它的方法的一些轉(zhuǎn)儲信息輸出到標(biāo)準(zhǔn)輸出。該工具不把代碼反編譯為 java 源代碼,但是它會把字節(jié)代碼反匯編成為由 Java 虛擬機規(guī)范定義的字節(jié)代碼指令。

在你需要查看編譯器為你或者給你做了什么的時候,或者你想要看一處代碼的改動對編譯后的類文件有什么影響的時候,javap 相當(dāng)有用。

現(xiàn)在以我們前面提到的 StringBuffer 和 String 作為一個例子。下面是一個專門為例子設(shè)計的類,它有兩個方法,都返回一個由0到 n 的數(shù)字組成的 String,其中 n 由調(diào)用者提供。兩個方法唯一的區(qū)別在于一個使用 String 構(gòu)建結(jié)果,另外一個使用 StringBuffer 構(gòu)建結(jié)果。

public class JavapTip {
public static void main(String []args) {
}

PRivate static String withStrings(int count) {
String s = "";
for (int i = 0; i < count; i++) {
s += i;
}

return s;
}

private static String withStringBuffer(int count) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < count; i++) {
sb.append(i);
}

return sb.toString();
}
}

現(xiàn)在讓我們看看對這個類使用–c 選項運行 javap 的輸出。-c 選項告訴 javap 反匯編在類中碰到的字節(jié)代碼。

運行方式如下:

>javap -c JavapTip

此命令的輸出為:

Method java.lang.String withStrings(int)
0 ldc #2
2 astore_1
3 iconst_0
4 istore_2
5 goto 30
8 new #3
11 dup
12 invokespecial #4
15 aload_1
16 invokevirtual #5
19 iload_2
20 invokevirtual #6
23 invokevirtual #7
26 astore_1
27 iinc 2 1
30 iload_2
31 iload_0
32 if_icmplt 8
35 aload_1
36 areturn

Method java.lang.String withStringBuffer(int)
0 new #3
3 dup
4 invokespecial #4
7 astore_1
8 iconst_0
9 istore_2
10 goto 22
13 aload_1
14 iload_2
15 invokevirtual #6
18 pop
19 iinc 2 1
22 iload_2
23 iload_0
24 if_icmplt 13
27 aload_1
28 invokevirtual #7
31 areturn

假如你以前沒有看過 Java 匯編器,那么這個輸出對你來說就會比較難懂,但是你應(yīng)該可以看到 withString 方法在每次循環(huán)的時候都新創(chuàng)建了一個 StringBuffer 實例。然后它將已有的 String 的當(dāng)前值追加到 StringBuffer 上,然后追加循環(huán)的當(dāng)前值。最后,它對 buffer 調(diào)用 toString 并將結(jié)果賦給現(xiàn)有的 String 引用。

withStringBuffer 方法與這個方法正好相反,在每次循環(huán)的時候 withStringBuffer 只調(diào)用現(xiàn)有 StringBuffer 的 append 方法,沒有創(chuàng)建新的對象,也沒有新的 String 引用。

在這種情況下,我們已經(jīng)知道了使用 StringBuffer 代替 String 是一種好的做法,但是假如我們不知道呢?那么 javap 可以幫助我們找到答案。在這里你可以看到更具體的關(guān)于String,StringBuffer 的解釋

你并不會經(jīng)常需要一個 Java 反匯編器,但是當(dāng)你需要的時候,知道你自己的機器已經(jīng)有一個并且用法相當(dāng)簡單的反匯編器當(dāng)然是一件好事。假如你感愛好,看書看看 javap 的其它選項——或許你會發(fā)現(xiàn)在你的環(huán)境中需要的特性。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 玉山县| 龙口市| 淳安县| 伊金霍洛旗| 厦门市| 秦皇岛市| 宁德市| 万载县| 开远市| 界首市| 宝兴县| 皋兰县| 弥渡县| 彰化市| 通化县| 准格尔旗| 柯坪县| 石家庄市| 蛟河市| 嘉峪关市| 南郑县| 芦溪县| 福州市| 西城区| 天柱县| 达拉特旗| 通城县| 兴义市| 晋州市| 开原市| 沙坪坝区| 七台河市| 龙江县| 大港区| 竹北市| 仁布县| 新巴尔虎左旗| 东海县| 达尔| 南陵县| 红河县|