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

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

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

反汇编器-javap

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


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

javap反编译命令的使用

javap反编译命令的使用   用习惯了著名的反编译工具jad的话,如果有的时候单给出class文件,要快速看这个class文件  的JDK版本号等,其实不用工具,也可以用JDK自带的javap...
  • u011121525
  • u011121525
  • 2013年08月09日 17:13
  • 1390

Java基础之String、StringBuffer与StringBuilder的区别及应用场景

1 String、StringBuffer与StringBuilder (1)String 字符串常量; /** Strings are constant; their values cann...
  • chenliguan
  • chenliguan
  • 2016年07月14日 18:35
  • 6278

java基础面试题:String和StringBuffer的区别

java基础面试题:String和StringBuffer的区别
  • u013628152
  • u013628152
  • 2016年03月31日 08:15
  • 695

Java 反编译命令javap

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

int和Integer的区别 String和StringBuffer的区别

Java提供两种不同的类型:引用类型和原始类型(内置类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。 Java为每个原始数据类型提供了封装类。 其中原始数据类...
  • linming_loulan
  • linming_loulan
  • 2017年09月14日 12:46
  • 491

String,StringBuilder和StringBuffer区别及使用场景

面试中常常会遇到这样的问题:1、你了解String类吗?2、String,StringBuilder和StringBuffer适合在什么样的场景下使用? 1、String类 首先看一下String...
  • LoveYaozu
  • LoveYaozu
  • 2015年07月24日 14:03
  • 2939

String,StringBuffer,StringBuilder 三者之间的区别是什么?

1.String 字符串产量 2.StringBuffer 字符串变量(线程安全) 3.StringBuilder 字符串变量 (非线程安全) 1.String类型,是java内的对象,...
  • qq_30278639
  • qq_30278639
  • 2016年05月10日 14:09
  • 859

String、Stringbuffer与Stringbuilder的区别

1、在执行速度上:Stringbuilder->Stringbuffer->String 2、String是字符串常量       Stringbuffer是字符串变量       String...
  • u011247942
  • u011247942
  • 2017年06月22日 15:03
  • 231

JAVA之String,StringBuffer与StringBuilder三者之间的区别

JAVA之String,StringBuffer与StringBuilder三者之间的区别
  • mmd0308
  • mmd0308
  • 2017年06月16日 16:37
  • 183

Java中String、StringBuffer、StringBuilder简述及区别

容我喝杯82年的Java压压惊~~~如有欢迎指正。 1.String:由多个字符组成的一串数据,相当与...
  • MAGIC_JSS
  • MAGIC_JSS
  • 2016年05月10日 23:35
  • 1370
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:应用反编译命令JavaP理解String和StringBuffer的区别
举报原因:
原因补充:

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