[初级]Java命令学习系列(七)——javap
生活随笔
收集整理的這篇文章主要介紹了
[初级]Java命令学习系列(七)——javap
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
轉載自?[初級]Java命令學習系列(七)——javap
javap是jdk自帶的一個工具,可以對代碼反編譯,也可以查看java編譯器生成的字節碼。
一般情況下,很少有人使用javap對class文件進行反編譯,因為有很多成熟的反編譯工具可以使用,比如jad。但是,javap還可以查看java編譯器為我們生成的字節碼。通過它,可以對照源代碼和字節碼,從而了解很多編譯器內部的工作。
實例
javap命令分解一個class文件,它根據options來決定到底輸出什么。如果沒有使用options,那么javap將會輸出包,類里的protected和public域以及類里的所有方法。javap將會把它們輸出在標準輸出上。來看這個例子,先編譯(javac)下面這個類。
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后,輸出結果如下
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,那么輸出結果如下
Compiled from "DocFooter.java" public class DocFooter extends java.applet.Applet {java.lang.String date;java.lang.String email;public DocFooter();Code:0: aload_0 ? ? ? 1: invokespecial #1 ? ? ? ? ? ? ? ? ?// Method java/applet/Applet."<init>":()V4: return ? ? ? ?public void init();Code:0: aload_0 ? ? ? 1: sipush ? ? ? ?5004: bipush ? ? ? ?1006: invokevirtual #2 ? ? ? ? ? ? ? ? ?// Method resize:(II)V9: aload_0 ? ? ? 10: aload_0 ? ? ? 11: ldc ? ? ? ? ? #3 ? ? ? ? ? ? ? ? ?// String LAST_UPDATED13: invokevirtual #4 ? ? ? ? ? ? ? ? ?// Method getParameter:(Ljava/lang/String;)Ljava/lang/String;16: putfield ? ? ?#5 ? ? ? ? ? ? ? ? ?// Field date:Ljava/lang/String;19: aload_0 ? ? ? 20: aload_0 ? ? ? 21: ldc ? ? ? ? ? #6 ? ? ? ? ? ? ? ? ?// String EMAIL23: invokevirtual #4 ? ? ? ? ? ? ? ? ?// Method getParameter:(Ljava/lang/String;)Ljava/lang/String;26: putfield ? ? ?#7 ? ? ? ? ? ? ? ? ?// Field email:Ljava/lang/String;29: return ? ? ? ?public void paint(java.awt.Graphics);Code:0: aload_1 ? ? ? 1: new ? ? ? ? ? #8 ? ? ? ? ? ? ? ? ?// class java/lang/StringBuilder4: dup ? ? ? ? ? 5: invokespecial #9 ? ? ? ? ? ? ? ? ?// Method java/lang/StringBuilder."<init>":()V8: aload_0 ? ? ? 9: getfield ? ? ?#5 ? ? ? ? ? ? ? ? ?// Field date:Ljava/lang/String;12: invokevirtual #10 ? ? ? ? ? ? ? ? // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;15: ldc ? ? ? ? ? #11 ? ? ? ? ? ? ? ? // String ?by 17: invokevirtual #10 ? ? ? ? ? ? ? ? // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;20: invokevirtual #12 ? ? ? ? ? ? ? ? // Method java/lang/StringBuilder.toString:()Ljava/lang/String;23: bipush ? ? ? ?10025: bipush ? ? ? ?1527: invokevirtual #13 ? ? ? ? ? ? ? ? // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V30: aload_1 ? ? ? 31: aload_0 ? ? ? 32: getfield ? ? ?#7 ? ? ? ? ? ? ? ? ?// Field email:Ljava/lang/String;35: sipush ? ? ? ?29038: bipush ? ? ? ?1540: invokevirtual #13 ? ? ? ? ? ? ? ? // Method java/awt/Graphics.drawString:(Ljava/lang/String;II)V43: return ? ? ? ? }上面輸出的內容就是字節碼。
用法摘要
-help 幫助 -l 輸出行和變量的表 -public 只輸出public方法和域 -protected 只輸出public和protected類和成員 -package 只輸出包,public和protected類和成員,這是默認的 -p -private 輸出所有類和成員 -s 輸出內部類型簽名 -c 輸出分解后的代碼,例如,類中每一個方法內,包含java字節碼的指令, -verbose 輸出棧大小,方法參數的個數 -constants 輸出靜態final常量總結
javap可以用于反編譯和查看編譯器編譯后的字節碼。平時一般用javap -c比較多,該命令用于列出每個方法所執行的JVM指令,并顯示每個方法的字節碼的實際作用。可以通過字節碼和源代碼的對比,深入分析java的編譯原理,了解和解決各種Java原理級別的問題。
總結
以上是生活随笔為你收集整理的[初级]Java命令学习系列(七)——javap的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9个最佳科技标识以及如何制作自己的[20
- 下一篇: 2022年买什么笔记本电脑好?