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

原创 2004年09月09日 09:34:00

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

现在让我们看看对这个类使用–c 选项运行 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 的其它选项——或许你会发现在你的环境中需要的特性。


--------------------------------------------------------------------------------
本文作者:David Petersheim是Genscape公司的一位应用开发主任。他设计和开发服务器端应用程序来获取和处理实时能源数据。 

javap命令将java的class文件反汇编

jdk自带的很多命令都很有用,今天就来简单介绍下jdk的javap命令,javap是jdk自带的反汇编器,使用此命令,可以将java文件编译后的class文件反汇编进而看到java编译器给我 们生成的...
  • u012990533
  • u012990533
  • 2015年04月03日 17:19
  • 2732

javap(反汇编命令)详解

转载地址:http://blog.csdn.net/hudashi/article/details/7062668 javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它...
  • rnZuoZuo
  • rnZuoZuo
  • 2016年11月03日 11:36
  • 302

javap反编译java字节码文件

概述:          javap是 Java class文件分解器,可以反编译,也可以查看java编译器生成的字节码,从而对代码内部的执行逻辑进行分析。 语法:         把java文件编...
  • haovip123
  • haovip123
  • 2016年08月16日 14:58
  • 1943

自己的反汇编引擎——Intel指令编码学习(3)

图片弄不上去 真是烦!!!!
  • aap159951
  • aap159951
  • 2015年09月24日 09:22
  • 412

apk反汇编之smali语法(转)

类型 Dalvik的字节码中拥有两个主要的类型:基类和引用类型。引用类型 引用类型是对象和数组,其他的一切都是基类   基类被一个简单的字符描述。我没有提出这些缩写词———他们实际...
  • C_Major
  • C_Major
  • 2014年10月18日 20:38
  • 1762

Linux内核分析 学习笔记之反汇编分析

之前一直零星地想去学习了解操作系统原理书也买了一大堆,但总没有个进度的压力,没能做出一个完整的系统。如今,网易云课堂里干好有一个课程叫《linux内核分析》(哈哈 就当做个广告也无妨哈)。希望能够跟着...
  • skyztttt
  • skyztttt
  • 2015年03月08日 22:56
  • 1305

javap(反汇编命令)详解

说实话,平时很少用到javap命令,除了学习jvm的时候用。但最近在学习scala语言,尤其在类和对象部分,用javap命令有助于理解scala。 比如,我创建 了一个类,然后就可以用javap -...
  • qq_36330643
  • qq_36330643
  • 2017年06月28日 14:30
  • 80

LINUX下GDB反汇编和调试

Linux下的汇编与Windows汇编最大的不同就是第一个操作数是原操作数,第二个是目的操作数,而Windows下却是相反。 1、 基本操作指令 简单的操作数类型说明,一般有三种, (1...
  • hustyangju
  • hustyangju
  • 2014年06月05日 14:38
  • 1626

反汇编---汇编基础学习

一、一些简单的说明 本文描述的是x86汇编,采用ATT汇编代码格式,讨论的是一个运行Linux的x86系统。使用gcc编译器,gdb调试器,objdump等相关工具观察反汇编代码。 关于寻址模式、堆栈...
  • li_xiang_li
  • li_xiang_li
  • 2016年02月04日 13:56
  • 395

javap(反汇编命令)详解

javap是JDK自带的反汇编器,可以查看java编译器为我们生成的字节码。通过它,我们可以对照源代码和字节码,从而了解很多编译器内部的工作。 语法:   javap [ 命令选项 ] cla...
  • i10mg
  • i10mg
  • 2013年03月30日 22:47
  • 373
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用javap 反汇编帮你理解java特性
举报原因:
原因补充:

(最多只允许输入30个字)