熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

javap(反匯編命令)詳解

2013-11-23 19:36:07  來源: Java核心技術 

  javap是JDK自帶的反匯編器可以查看java編譯器為我們生成的字節碼通過它我們可以對照源代碼和字節碼從而了解很多編譯器內部的工作
語法
  javap [ 命令選項 ] class
  javap 命令用於解析類文件其輸出取決於所用的選項若沒有使用選項javap 將輸出傳遞給它的類的 public 域及方法javap 將其輸出到標准輸出設備上
命令選項
  help 輸出 javap 的幫助信息
  l 輸出行及局部變量表
  b 確保與 JDK javap 的向後兼容性
  public 只顯示 public 類及成員
  protected 只顯示 protected 和 public 類及成員
  package 只顯示包protected 和 public 類及成員這是缺省設置
  private 顯示所有類和成員
  J[flag] 直接將 flag 傳給運行時系統
  s 輸出內部類型簽名
  c 輸出類中各方法的未解析的代碼即構成 Java 字節碼的指令
  verbose 輸出堆棧大小各方法的 locals 及 args 數以及class文件的編譯版本
  classpath[路徑] 指定 javap 用來查找類的路徑如果設置了該選項則它將覆蓋缺省值或 CLASSPATH 環境變量目錄用冒號分隔
    bootclasspath[路徑] 指定加載自舉類所用的路徑缺省情況下自舉類是實現核心 Java 平台的類位於 jrelib
  tjar 和 jrelibinjar 中
  extdirs[dirs] 覆蓋搜索安裝方式擴展的位置擴展的缺省位置是 jrelibext
實例
Hellojava文件
public class Hello
{
static void main(String args[])
{
int i=;
int j=;
int m=i+j;
Systemoutprintln(m:+m);
}
int get()
{
int a=;
int b=;
int c=;
int d=;
int e=;
int f=;
int n=a+b+c+d+e+f;
return n;
}
static int get()
{
int a=;
int b=;
int c=;
int d=a+b;
return d;
}
}
然後再執行以下命令
javac Hellojava
javap c Hello
得到
Compiled from Hellojava
public class Hello extends javalangObject{
public Hello();
  Code:
   :
aload_
   :
invokespecial #; //Method java/lang/Object<init>:()V
   :
return

  static void main(javalangString[]);
  Code:
   :
bipush

   :
istore_
   :
bipush

   :
istore_
   :
iload_
   :
iload_
   :
iadd
   :
istore_
   :
getstatic #; //Field java/lang/Systemout:Ljava/io/PrintStream;
   :
new #; //class java/lang/StringBuilder
   :
dup
   :
invokespecial #; //Method java/lang/StringBuilder<init>:()V
   :
ldc #; //String m:
   :
invokevirtual #; //Method java/lang/StringBuilderappend:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   :
iload_
   :
invokevirtual #; //Method java/lang/StringBuilderappend:(I)Ljava/lang/StringBuilder;
   :
invokevirtual #; //Method java/lang/StringBuildertoString:()Ljava/lang/String;
   :
invokevirtual #; //Method java/io/PrintStreamprintln:(Ljava/lang/String;)V
   :
return

  int get();
  Code:
   :
iconst_
   :
istore_
   :
iconst_
   :
istore_
   :
iconst_
   :
istore_
   :
iconst_
   :
istore
   :
iconst_
   :
istore
   :
bipush
   :
istore

   :
iload_
   :
iload_
   :
iadd
   :
iload_
   :
iadd
   :
iload
   :
iadd
   :
iload
   :
iadd
   :
iload
   :
iadd
   :
istore
   :
iload
   :
ireturn

  static int get();
  Code:
   :
iconst_
   :
istore_
   :
bipush
   :
istore_
   :
bipush
   :
istore_
   :
iload_
   :
iload_
   :
iadd
   :
istore_
   :
iload_
   :
ireturn

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/27151.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.