快精灵印艺坊 您身边的文印专家
广州名片 深圳名片 会员卡 贵宾卡 印刷 设计教程
产品展示 在线订购 会员中心 产品模板 设计指南 在线编辑
 首页 名片设计   CorelDRAW   Illustrator   AuotoCAD   Painter   其他软件   Photoshop   Fireworks   Flash  

 » 彩色名片
 » PVC卡
 » 彩色磁性卡
 » 彩页/画册
 » 个性印务
 » 彩色不干胶
 » 明信片
   » 明信片
   » 彩色书签
   » 门挂
 » 其他产品与服务
   » 创业锦囊
   » 办公用品
     » 信封、信纸
     » 便签纸、斜面纸砖
     » 无碳复印纸
   » 海报
   » 大篇幅印刷
     » KT板
     » 海报
     » 横幅

用javap 反汇编帮你理解java特性

用javap 反汇编帮你理解java特性 (使用 javap 深入查看类文件)

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

Java 开发人员认识在一个循环中使用StringBuffer 来代替串联 String 对象能获得最佳性能。然而,多数开发人员从来没有比较两种方式产生的字节代码的区别。在 Java 开发工具包(JDK)中有一个叫做 javap 的工具可以告诉你为什么这样做可以获得最佳性能。



Javap 将一个类和它的方式的一些转储信息输出到标准输出。该工具不把代码反编译为 java 源代码,但是它会把字节代码反汇编成为由 Java 虚拟机规范定义的字节代码指令。

在你需要查看编译器为你或者给你做了什么的时候,或者你想要看一处代码的改动对编译后的类文件有什么影响的时候,javap 相称有用。

现在以我们前面提到的 StringBuffer 和 String 作为一个例子。下面是一个专门为例子设计的类,它有两个方式,都返回一个由0到 n 的数字组成的 String,其中 n 由调用者提供。两个方式唯一的区别在于一个使用 String 构建结果,另外一个使用 StringBuffer 构建结果。

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();
}
}

现在让我们看看对这个类使用?Cc 选项运行 javap 的输出。-c 选项告诉 javap 反汇编在类中碰到的字节代码。

运行方法如下:

>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 汇编器,那么这个输出对你来说就会比较难懂,但是你应该可以看到 withString 方式在每次循环的时候都新创建了一个 StringBuffer 实例。然后它将已有的 String 的当前值追加到 StringBuffer 上,然后追加循环的当前值。最后,它对 buffer 调用 toString 并将结果赋给现有的 String 引用。

withStringBuffer 方式与这个方式正好相反,在每次循环的时候 withStringBuffer 只调用现有 StringBuffer 的 append 方式,没有创建新的对象,也没有新的 String 引用。

在这种情况下,我们已经知道了使用 StringBuffer 代替 String 是一种好的做法,但是假如我们不知道呢?那么 javap 可以帮助我们找到答案。在这里你可以看到更具体的关于String,StringBuffer 的解释

你并不会常常需要一个 Java 反汇编器,但是当你需要的时候,知道你自己的机器已经有一个并且用法相称简朴的反汇编器当然是一件好事。假如你感爱好,看书看看 javap 的其它选项――或许你会发现在你的环境中需要的特性。





返回类别: 教程
上一教程: 学习Java的笔记(2)
下一教程: JAVA代码编写的30条建议

您可以阅读与"用javap 反汇编帮你理解java特性"相关的教程:
· 反汇编器-JAVAP.EXE
· JAVA里字符编码的探索与理解
· Java入门:理解构造器 (转)
· Java1.5语言新特性简朴总结
· JAVA中几个易混淆要害词的理解
    微笑服务 优质保证 索取样品