javap是jdk工具中自帶的反編譯工具,它是根據class位元組碼檔案,反解析出當前類對應的code區(彙編指令)、本地變量表、異常表和程式碼行偏移量對映表、常量池等重要資訊。不過有些資訊是得透過在編譯(javac)時,指定引數才能輸出。
以下為javap指令使用介紹
javap [option] <classfile>
classfile: 就是你要反編譯的class檔案
option: 放置參數。可在終端機中直接輸數javap或javap -help即可看到有哪些參數可以使用
依照參數作用的類型我大致分成三大塊,如下:
-vserion:當前反編譯的jdk版本
-public:僅顯示公共類和成員-protected:顯示受保護的/公共類和成員-p  -private:顯示所有類和成員-package:顯示程序包/受保護的/公共類和成員-sysinfo:顯示正在處理的類的系統訊息(路徑、大小、日期、MD5)-constants:顯示靜態最終常量
-s:列出內部類型簽名-l:列出行數和本地變量表-c:反彙編代碼-v -vervose:輸出附加訊息
準備一個名為JavapTest.java的檔案,程式碼如下:
package Controller;
public class JavapTest{
  public String publicString;
  protected String protectedString;
  String friendlyString;
  private String privateString;
  public static final String staticString1 = "static final";
  static {
    String staticString2 = "測試";
  }
  {
    String privateString = "javap test";
  }
  private void privateConstructor(){
  }
  int getNum(int x){
    return x+x;
  }
  protected String showProtectedString(){
    return protectedString;
  }
  public void showInfo(){
    int x = 10;
    System.out.println(privateString+x);
  }
}
將其檔案進行編譯,編譯方式請參考Day4-java語言編譯器:javac & 運行工具:java (上)
有了class檔案後,即可加入不同的參數進行查看。

-versionjavap -version 

其實-version這參數作用指的是當前javap工具的版本,而非該class編譯時的版本,故只要下javap -version即可查看。
-publicjavap -public JavapTest.class

-protectedjavap -protected JavapTest.class

-p -privatejavap -p JavapTest.class
或
javap -private JavapTest.class

-packagejavap -package JavapTest.class

-sysinfojavap -sysinfo JavapTest.class

-constantsjavap -constants JavapTest.class

-sjavap -s JavapTest.class

-ljavap -l JavapTest.class

-cjavap -c JavapTest.class

-v -verbosejavap -v JavapTest.class
或
javap -verbose JavapTest.class



最常使用到的參數大概只有-l、-c、-v,不過在使用這些參數時,要特別注意,顯示出來的可能只會有protected以上的級別,若要查看全部的類別時,再多加上-p 參數即可。
例:
javap -l JavaTest.class

javap -l -p JavaTest.class
