推薦一款IDEA神器!一鍵查看Java字節(jié)碼以及其他類信息
這里分享一下一款IDEA神器。非常實用!你會愛上它的!
開始推薦 IDEA 字節(jié)碼查看神器之前,先來回顧一下 Java 字節(jié)碼是啥。
何為 Java 字節(jié)碼?
Java 虛擬機(JVM)是運行 Java 字節(jié)碼的虛擬機。JVM 有針對不同系統(tǒng)的特定實現(xiàn)(Windows,Linux,macOS),目的是使用相同的字節(jié)碼,它們都會給出相同的結果。
什么是字節(jié)碼?采用字節(jié)碼的好處是什么?
在 Java 中,JVM 可以理解的代碼就叫做 字節(jié)碼
(即擴展名為 .class
的文件),它不面向任何特定的處理器,只面向虛擬機。Java 語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同時又保留了解釋型語言可移植的特點。所以 Java 程序運行時比較高效,而且,由于字節(jié)碼并不針對一種特定的機器,因此,Java 程序無須重新編譯便可在多種不同操作系統(tǒng)的計算機上運行。
Java 程序從源代碼到運行一般有下面 3 步:
為什么要查看 Java 字節(jié)碼?
我們在平時學習的時候,經(jīng)常需要查看某個 java 類的字節(jié)碼文件。查看字節(jié)碼文件更容易讓我們搞懂 java 代碼背后的原理比如搞懂 java 中的各種語法糖的本質。
如何查看 Java 字節(jié)碼?
如果我們通過命令行來查看某個 class 的字節(jié)碼文件的話,可以直接通過 javap
命令,不過這種方式太原始了,效率十分低,并且看起來不直觀。
下面介紹兩種使用 IDEA 查看類對應字節(jié)碼文件的方式(_ javap
這種方式就不提了_)。
我們以這段代碼作為案例:
- public class Main {
- public static void main(String[] args) {
- Integer i = null;
- Boolean flag = false;
- System.out.println(flag ? 0 : i);
- }
- }
上面這段代碼由于使用三目運算符不當導致詭異了 NPE 異常。為了搞清楚事情的原因,我們來看其對應的字節(jié)碼。
使用 IDEA 自帶功能
我們點擊 View -> Show Bytecode
即可通過 IDEA 查看某個類對應的字節(jié)碼文件。
需要注意的是: 查看某個類對應的字節(jié)碼文件之前確保它已經(jīng)被編譯過。
稍等幾秒鐘之后,你就可以直觀到看到對應的類的字節(jié)碼內容了。
從字節(jié)碼中可以看出,我圈出來的位置發(fā)生了 拆箱操作 。
- 裝箱 :將基本類型用它們對應的引用類型包裝起來;
- 拆箱 :將包裝類型轉換為基本數(shù)據(jù)類型;
詳細解釋下就是: flag ? 0 : i
這行代碼中,0 是基本數(shù)據(jù)類型 int,返回數(shù)據(jù)的時候 i 會被強制拆箱成 int 類型,由于 i 的值是 null,因此就拋出了 NPE 異常。
- Integer i = null;
- Boolean flag = false;
- System.out.println(flag ? 0 : i);
如果,我們把代碼中 flag
變量的值修改為 true 的話,就不會存在 NPE 問題了,因為會直接返回 0,不會進行拆箱操作。
使用 IDEA 插件 jclasslib(推薦)
相比于 IDEA 自帶的查看類字節(jié)的功能,我更推薦 jclasslib
這個插件,非常棒!
使用 jclasslib
不光可以直觀地查看某個類對應的字節(jié)碼文件,還可以查看類的基本信息、常量池、接口、屬性、函數(shù)等信息。
我們直接在 IDEA 的插件市場即可找到這個插件。我這里已經(jīng)安裝好了。
安裝完成之后,重啟 IDEA。點擊 View -> Show Bytecode With jclasslib
即可通過 jclasslib
查看某個類對應的字節(jié)碼文件。