应用反编译命令JavaP理解String和StringBuffer的区别
2007-09-26 14:19
525 查看
此段文字摘自:http://www0.ccidnet.com/tech/guide/2001/08/06/58_2872.html
反汇编器-javap
javap命令反汇编一个java字节代码文件, 返回有关可变部分和成员函数的信息,其命令行如下:
javap的标准输出是公有变量和类的成员函数。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 构建结果。
现在让我们看看对这个类使用-c 选项运行 javap 的输出。-c 选项告诉 javap 反汇编在类中遇到的字节代码。
运行方式如下:
>javap -c JavapTip
此命令的输出为:
如果你以前没有看过 Java 汇编器,那么这个输出对你来说就会比较难懂,但是你应该可以看到 withString 方法在每次循环的时候都新创建了一个 StringBuffer 实例。然后它将已有的 String 的当前值追加到 StringBuffer 上,然后追加循环的当前值。最后,它对 buffer 调用 toString 并将结果赋给现有的 String 引用。
withStringBuffer 方法与这个方法正好相反,在每次循环的时候 withStringBuffer 只调用现有 StringBuffer 的 append 方法,没有创建新的对象,也没有新的 String 引用。
在这种情况下,我们已经知道了使用 StringBuffer 代替 String 是一种好的做法,但是如果我们不知道呢?那么 javap 可以帮助我们找到答案。在这里你可以看到更详细的关于String,StringBuffer 的解释
你并不会经常需要一个 Java 反汇编器,但是当你需要的时候,知道你自己的机器已经有一个并且用法相当简单的反汇编器当然是一件好事。如果你感兴趣,看书看看 javap 的其它选项——或许你会发现在你的环境中需要的特性。
反汇编器-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的版本信息 |
使用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(); } } |
运行方式如下:
>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 |
withStringBuffer 方法与这个方法正好相反,在每次循环的时候 withStringBuffer 只调用现有 StringBuffer 的 append 方法,没有创建新的对象,也没有新的 String 引用。
在这种情况下,我们已经知道了使用 StringBuffer 代替 String 是一种好的做法,但是如果我们不知道呢?那么 javap 可以帮助我们找到答案。在这里你可以看到更详细的关于String,StringBuffer 的解释
你并不会经常需要一个 Java 反汇编器,但是当你需要的时候,知道你自己的机器已经有一个并且用法相当简单的反汇编器当然是一件好事。如果你感兴趣,看书看看 javap 的其它选项——或许你会发现在你的环境中需要的特性。
相关文章推荐
- JAVA中String与StringBuffer,StringBuilder应用的区别
- 深入理解String,StringBuffer以及StringBuilder的区别
- String、StringBuilder和StringBuffer的区别和应用场景
- Java String,StringBuilder,StringBuffer区别和实际应用总结
- Java基础之String,StringBuffer与StringBuilder的区别及应用场景
- 【黑马程序员】String和StringBuffer 的区别与应用!
- Java中String、StringBuffer、StringBuilder区别与理解
- 深入理解String类型、StringBuilder、StringBuffer的区别与使用
- String,StringBuffer与StringBuilder的区别及应用场景
- 理解java String,深入解析StringBuffer和StringBuilder的区别
- Java的String和StringBuffer的区别及应用场景
- 从Java源码角度彻底理解String,StringBuilder和StringBuffer的区别
- Java中String、StringBuffer、StringBuilder区别与理解
- StringBuffer与String的区别与应用
- 详解String、StringBuffer和StringBuilder的区别和应用场景
- Java基础之String、StringBuffer与StringBuilder的区别及应用场景
- 从Java源码角度彻底理解String,StringBuilder和StringBuffer的区别
- 深刻理解Java中的String、StringBuffer和StringBuilder的区别
- String、Stringbuilder、Stringbuffer区别及应用场景
- java 的String, Stringbuffer, StringBuilder的区别以及对final关键字的理解