Java 基礎 - javap 反編譯命令


總結

javap是jdk自帶的反解析工具。它的作用就是根據class字節碼文件,反解析出當前類對應的code區(匯編指令)、本地變量表、異常表和代碼行偏移量映射表、常量池等等信息。

javap的用法格式:

javap <options> <classes>

其中classes就是你要反編譯的class文件。 在命令行中直接輸入javap或javap -help可以看到javap的options有如下選項:

-help  --help  -?        輸出此用法消息
 -version                 版本信息,其實是當前javap所在jdk的版本信息,不是class在哪個jdk下生成的。
 -v  -verbose             輸出附加信息(包括行號、本地變量表,反匯編等詳細信息)
 -l                         輸出行號和本地變量表
 -public                    僅顯示公共類和成員
 -protected               顯示受保護的/公共類和成員
 -package                 顯示程序包/受保護的/公共類 和成員 (默認)
 -p  -private             顯示所有類和成員
 -c                       對代碼進行反匯編
 -s                       輸出內部類型簽名
 -sysinfo                 顯示正在處理的類的系統信息 (路徑, 大小, 日期, MD5 散列)
 -constants               顯示靜態最終常量
 -classpath <path>        指定查找用戶類文件的位置
 -bootclasspath <path>    覆蓋引導類文件的位置

一般常用的是-v -l -c三個選項:

  • javap -v classxx,不僅會輸出行號、本地變量表信息、反編譯匯編代碼,還會輸出當前類用到的常量池等信息。
  • javap -l 會輸出行號和本地變量表信息。
  • javap -c 會對當前class字節碼進行反編譯生成匯編代碼。

 

詳細解析請看: 通過javap命令分析java匯編指令

 

javap 分析裝箱拆箱

關於equals比較

double i0 = 0.1;
Double i1 = new Double(0.1);
Double i2 = new Double(0.1);
System.out.println(i1.equals(i2)); //true 2個包裝類比較,比較的是包裝的基本數據類型的值

//javap 分析這句話
System.out.println(i1.equals(i0)); //true 基本數據類型和包裝類型比較時,會先把基本數據類型包裝后再比較

 

基本數據類型和包裝類比較時,會先把基本數據類型包裝成對應的包裝類型,再進行比較。這一點可以通過查看.class字節碼來證明:

 

 

關於 == 比較

對於基本數據類型,==(雙等號)比較的是值,而對於包裝類型,==(雙等號)比較的則是2個對象的內存地址。

double i0 = 0.1;
Double i1 = new Double(0.1);
Double i2 = new Double(0.1);
System.out.println(i1 == i2);    //false new出來的都是新的對象

//javap 分析這句話
System.out.println(i1 == i0);    //true 基本數據類型和包裝類比較,會先把包裝類拆箱

 

基本數據類型和包裝類型比較時,會先把包裝類拆箱再進行值比較(和equals是反的)。這個也可以通過查看字節碼來證明:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM