轉自:http://blog.csdn.net/hudashi/article/details/7062668
javap是JDK自帶的反匯編器,可以查看java編譯器為我們生成的字節碼。通過它,我們可以對照源代碼和字節碼,從而了解很多編譯器內部的工作。
語法:
javap [ 命令選項 ] class. . .
javap 命令用於解析類文件。其輸出取決於所用的選項。若沒有使用選項,javap 將輸出傳遞給它的類的 public 域及方法。javap 將其輸出到標准輸出設備上。
命令選項
-help 輸出 javap 的幫助信息。
-l 輸出行及局部變量表。
-b 確保與 JDK 1.1 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
t.jar 和 jrelibi18n.jar 中。
-extdirs[dirs] 覆蓋搜索安裝方式擴展的位置。擴展的缺省位置是 jrelibext。
實例1:
Hello.java文件
public class Hello
{
static void main(String args[])
{
int i=10;
int j=100;
int m=i+j;
System.out.println("m:"+m);
}
int get()
{
int a=1;
int b=2;
int c=3;
int d=4;
int e=5;
int f=6;
int n=a+b+c+d+e+f;
return n;
}
static int get2()
{
int a=1;
int b=12;
int c=39;
int d=a+b;
return d;
}
}
然后再執行以下命令:
javac Hello.java
javap -c Hello
得到
Compiled from "Hello.java"
public class Hello extends java.lang.Object{
public Hello();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
static void main(java.lang.String[]);
Code:
0: bipush 10
2: istore_1
3: bipush 100
5: istore_2
6: iload_1
7: iload_2
8: iadd
9: istore_3
10: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
13: new #3; //class java/lang/StringBuilder
16: dup
17: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
20: ldc #5; //String m:
22: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
25: iload_3
26: invokevirtual #7; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
29: invokevirtual #8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
32: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
35: return
int get();
Code:
0: iconst_1
1: istore_1
2: iconst_2
3: istore_2
4: iconst_3
5: istore_3
6: iconst_4
7: istore 4
9: iconst_5
10: istore 5
12: bipush 6
14: istore 6
16: iload_1
17: iload_2
18: iadd
19: iload_3
20: iadd
21: iload 4
23: iadd
24: iload 5
26: iadd
27: iload 6
29: iadd
30: istore 7
32: iload 7
34: ireturn
static int get2();
Code:
0: iconst_1
1: istore_0
2: bipush 12
4: istore_1
5: bipush 39
7: istore_2
8: iload_0
9: iload_1
10: iadd
11: istore_3
12: iload_3
13: ireturn
}
另外關於如何使用javap命令查看class文件的編譯版本請參考《
用javap查看編譯版本》
