麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > ASM > 正文

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

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

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

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

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



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

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

現(xiàn)在以我們前面提到的 StringBuffer 和 String 作為一個(gè)例子。下面是一個(gè)專門為例子設(shè)計(jì)的類,它有兩個(gè)方法,都返回一個(gè)由0到 n 的數(shù)字組成的 String,其中 n 由調(diào)用者提供。兩個(gè)方法唯一的區(qū)別在于一個(gè)使用 String 構(gòu)建結(jié)果,另外一個(gè)使用 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)在讓我們看看對(duì)這個(gè)類使用–c 選項(xiàng)運(yùn)行 javap 的輸出。-c 選項(xiàng)告訴 javap 反匯編在類中碰到的字節(jié)代碼。

運(yùn)行方式如下:

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

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

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

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 精品国产乱码久久久久久丨区2区 | 麻豆91精品91久久久 | 欧美中文字幕一区二区 | 美国一级黄色毛片 | 亚洲一区二区三区视频 | 久久凹凸 | 国产一级毛片a | 二区三区在线观看 | 亚洲草逼视频 | 成人免费在线视频播放 | 羞羞视频2023 | 国产一区在线免费 | 成人午夜看片 | 久久草在线观看视频 | 国产激情视频在线 | 亚洲啊v在线观看 | 欧美a级大胆视频 | 国产精品99久久久久久久女警 | 欧美成人三级视频 | 369看片你懂的小视频在线观看 | 成人在线视频精品 | 久久国产成人精品国产成人亚洲 | 中国hdxxxx护士爽在线观看 | 国产一级毛片网站 | 精品一区二区三区毛片 | 欧美国产日韩在线观看成人 | 成年免费大片黄在线观看岛国 | 护士xxxx | 久久影院免费观看 | 免费毛片电影 | 性爱视频免费 | 日本中文不卡视频 | 高清视频91| 精品一区二区三区在线播放 | 国产艳妇av视国产精选av一区 | 日本成人午夜视频 | 国产成人精品一区在线播放 | 日韩精品中文字幕一区二区三区 | 精品国产91久久久久久浪潮蜜月 | avav在线播放| 欧洲精品久久久 |