總結
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是反的)。這個也可以通過查看字節碼來證明:

