应用反编译命令JavaP理解String和StringBuffer的区别

原创 2007年09月26日 14:19:00

此段文字摘自:http://www0.ccidnet.com/tech/guide/2001/08/06/58_2872.html

反汇编器-javap

  javap命令反汇编一个java字节代码文件, 返回有关可变部分和成员函数的信息,其命令行如下:

   C:/>javap options classname additionalClasses

  javap的标准输出是公有变量和类的成员函数。javap反汇编器的命令行选项如下表:

选项 功能
-h 此选项将建立能够放入C头文件中的信息
-p 此选项将使javap输出私有和公有的成员函数和变量
-c 此选项将使javap为各成员函数输出实际已编译过的字节代码
-classpath path 此选项将使得javap在路径path中寻找Java类
-v 输出所有的信息
-verify 运行校验器以验证并显示出调试信息
-version 输出javap的版本信息

 此段文字摘自:http://www.it315.org/articles/Java/java4.htm

使用Javap获得不止于文档的东西


Javadoc允许你基于Java代码生成文档,但是它主要是面向于Web客户。幸运的是,存在另外的基于Java代码生成文档的方式,例如javap命令。
javap是一个Java类分解工具。它能够将一个类分解为一个字节码的描述,在这些描述中告诉了你在没有进行实际的反编译类之前的一个实现是什么样的。和javac不同,javap使用class文件而不是源文件。这意味着你可以在没有任何有效的源代码的情况下在jar中的class上使用javap。

运行javap的标准方式是:

javap 〈classname〉

在命令行上,举例如下:

javap java.lang.Object

这将输出如下信息:

Compiled from Object.java
public class java.lang.Object {
public java.lang.Object( );
public final native java.lang.Class getClass( );
public native int hashCode( );
public boolean equals(java.lang.Object);
protected native java.lang.Object clone( ) throws java.lang.CloneNotSupportedException;
public java.lang.String toString( );
public final native void notify( );
public final native void notifyAll( );
public final native void wait(long) throws java.lang.InterruptedException;
public final void wait(long, int) throws java.lang.InterruptedException;
public final void wait( ) throws java.lang.InterruptedException;
protected void finalize( ) throws java.lang.Throwable;
static { };
}

分解代码能得到一些有用的信息,例如通过javap ?Cc能知道Object.wait方法在执行时的情况。

Method void wait( )
0 aload_0
1 lconst_0
2 invokevirtual #16 〈Method void wait(long)〉
5 return

即使是对分解的代码没有很多的理解,也是很容易看出Object.wait( )只是简单的调用了Object.wait(long)。然而,传递到Object.wait(long)中的实际的值是看不到的。

分解代码是一个有用的特性,但是javap最常用的用途还是用来快速的查看一个类可用的方法,从命令行使用javap常常是更简单,即使是有源代码和javadoc的情况下。

此段文字摘自:http://dev.yesky.com/82/2232582.shtml

应用Javap反编译命令JavaP理解String和StringBuffer的区别

  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 的其它选项——或许你会发现在你的环境中需要的特性。

相关文章推荐

深入理解String、StringBuffer、StringBuilder(转)

相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String、StringBuilder和StringBuffer这几个类,分析它...

JVM 使用javap反编译命令解释i++和++i的区别

一个简单的例子public class Test{ public static void main(String[] args){ int i = 0; int...

用javap命令反编译来分析字符串问题

编写Test.java,编译完后生成Test.class文件,然后对该文件执行javap -c Test命令,生成字节码指令,阅读并得出结论 一、s1和s2指向常量池的不同常量 ①java...

Java 反编译命令javap

javap是jdk自带的一个工具,可以对代码反编译,也可以查看java编译器生成的字节码。 一般情况下,很少有人使用javap对class文件进行反编译,因为有很多成熟的反编译工具可以使用,...

string与stringbuffer的区别

  • 2012年08月12日 22:16
  • 18KB
  • 下载

string和StringBuffer的区别

  • 2012年01月05日 09:48
  • 15KB
  • 下载

详解String、StringBuffer和StringBuilder的区别和应用场景

String、StringBuffer和StringBuilder的区别 String:字符串常量 。StringBuffer 与 StringBuilder是字符缓冲变量。StringB...

黑马程序员——String与StringBuffer、StringBuilder的应用与区别

------- android培训、java培训、期待与您交流! ---------- String与StringBuffer、StringBuilder的应用与区别 1.String:代表字符串...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:应用反编译命令JavaP理解String和StringBuffer的区别
举报原因:
原因补充:

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