javap

javap是jdk自帶的一個工具,可以反編譯,也可以查看java編譯器生成的位元組碼,是分析代碼的一個好工具。
javap - Java class檔案分解器
分解class檔案
摘要:
javap [ options ] class. . .
描述:
javap命令分解一個class檔案,它根據options來決定到底輸出什麼。如果沒有使用options,那么javap將會輸出包,類里的protected和public域以及類里的所有方法。javap將會把它們輸出在標準輸出上。來看這個例子,先編譯下面這個類。
Java代碼
import java.awt.*;
import java.applet.*;
public class DocFooter extends Applet {
String date;
String email;
public void init() {
resize(500,100);
date = getParameter("LAST_UPDATED");
email = getParameter("EMAIL");
}
public void paint(Graphics g) {
g.drawString(date + " by ",100, 15);
g.drawString(email,290,15);
}
}
在命令行上鍵入javap DocFooter後,輸出結果如下
Java代碼
Compiled from DocFooter.java
public class DocFooter extends java.applet.Applet {
java.lang.String date;
java.lang.String email;
public DocFooter();
public void init();
public void paint(java.awt.Graphics);
}
如果加入了-c,即javap -c DocFooter,那么輸出結果如下
Java代碼
Compiled from DocFooter.java
public class DocFooter extends java.applet.Applet {
java.lang.String date;
java.lang.String email;
public DocFooter();
public void init();
public void paint(java.awt.Graphics);
}
Method DocFooter()
0 aload_0
1 invokespecial #1
4 return
Method void init()
0 aload_0
1 sipush 500
4 bipush 100
6 invokevirtual #2
9 aload_0
10 aload_0
11 ldc #3
13 invokevirtual #4
16 putfield #5
19 aload_0
20 aload_0
21 ldc #6
23 invokevirtual #4
26 putfield #7
29 return
Method void paint(java.awt.Graphics)
0 aload_1
1 new #8
4 dup
5 invokespecial #9
8 aload_0
9 getfield #5
12 invokevirtual #10
15 ldc #11
17 invokevirtual #10
20 invokevirtual #12
23 bipush 100
25 bipush 15
27 invokevirtual #13
30 aload_1
31 aload_0
32 getfield #7
35 sipush 290
38 bipush 15
40 invokevirtual #13
43 return
當然,如果想分析這個檔案,可以講輸出結果輸出到一個檔案里。可以這樣寫
javap -c DocFooter > F://test.txt
這樣就會輸出到F盤的test.txt檔案中了。
選項:
-help 不說了
-l 輸出行和變數的表
-public 只輸出public方法和域
-protected 只輸出public和protected類和成員
-package 只輸出包,public和protected類和成員,這是默認的
-private 輸出所有類和成員
-s 輸出內部類型簽名
-c 輸出分解後的代碼,例如,類中每一個方法內,包含java位元組碼的指令,
-verbose 輸出棧大小,方法參數的個數

相關詞條

相關搜尋

熱門詞條

聯絡我們