因爲後面要分享的一篇文章中用到了這篇文章要推薦的一個插件,因此這裏分享一下。很是實用!你會愛上它的!前端
開始推薦 IDEA 字節碼查看神器以前,先來回顧一下 Java 字節碼是啥。java
Java 虛擬機(JVM)是運行 Java 字節碼的虛擬機。JVM 有針對不一樣系統的特定實現(Windows,Linux,macOS),目的是使用相同的字節碼,它們都會給出相同的結果。git
什麼是字節碼?採用字節碼的好處是什麼?程序員
在 Java 中,JVM 能夠理解的代碼就叫作字節碼
(即擴展名爲.class
的文件),它不面向任何特定的處理器,只面向虛擬機。Java 語言經過字節碼的方式,在必定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特色。因此 Java 程序運行時比較高效,並且,因爲字節碼並不針對一種特定的機器,所以,Java 程序無須從新編譯即可在多種不一樣操做系統的計算機上運行。
Java 程序從源代碼到運行通常有下面 3 步:github
咱們在平時學習的時候,常常須要查看某個 java 類的字節碼文件。查看字節碼文件更容易讓咱們搞懂 java 代碼背後的原理好比搞懂 java 中的各類語法糖的本質。面試
若是咱們經過命令行來查看某個 class 的字節碼文件的話,能夠直接經過 javap
命令,不過這種方式太原始了,效率十分低,而且看起來不直觀。spring
下面介紹兩種使用 IDEA 查看類對應字節碼文件的方式(_javap
這種方式就不提了_)。json
咱們以這段代碼做爲案例:後端
public class Main { public static void main(String[] args) { Integer i = null; Boolean flag = false; System.out.println(flag ? 0 : i); } }
上面這段代碼因爲使用三目運算符不當致使詭異了 NPE 異常。爲了搞清楚事情的緣由,咱們來看其對應的字節碼。springboot
咱們點擊 View -> Show Bytecode
便可經過 IDEA 查看某個類對應的字節碼文件。
須要注意的是: 查看某個類對應的字節碼文件以前確保它已經被編譯過。
稍等幾秒鐘以後,你就能夠直觀到看到對應的類的字節碼內容了。
從字節碼中能夠看出,我圈出來的位置發生了 拆箱操做 。
- 裝箱:將基本類型用它們對應的引用類型包裝起來;
- 拆箱:將包裝類型轉換爲基本數據類型;
詳細解釋下就是:flag ? 0 : i
這行代碼中,0 是基本數據類型 int,返回數據的時候 i 會被強制拆箱成 int 類型,因爲 i 的值是 null,所以就拋出了 NPE 異常。
Integer i = null; Boolean flag = false; System.out.println(flag ? 0 : i);
若是,咱們把代碼中 flag
變量的值修改成 true 的話,就不會存在 NPE 問題了,由於會直接返回 0,不會進行拆箱操做。
相比於 IDEA 自帶的查看類字節的功能,我更推薦 jclasslib
這個插件,很是棒!
使用 jclasslib
不光能夠直觀地查看某個類對應的字節碼文件,還能夠查看類的基本信息、常量池、接口、屬性、函數等信息。
咱們直接在 IDEA 的插件市場便可找到這個插件。我這裏已經安裝好了。
安裝完成以後,重啓 IDEA。點擊View -> Show Bytecode With jclasslib
便可經過jclasslib
查看某個類對應的字節碼文件。
我整理了一份優質原創PDF資源免費分享給你們,大部份內容都是個人原創,少部分來自朋友。
<img src="https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-10/image-20201012105544846.png" style="zoom:50%;" />
<img src="https://cdn.jsdelivr.net/gh/javaguide-tech/blog-images/2020-10/image-20201012105608336.png" alt="image-20201012105608336" style="zoom:50%;" />
下載地址:https://cowtransfer.com/s/fbed14f0c22a4d 。
我是 Guide 哥,一 Java 後端開發,會一點前端,自由的少年。咱們下期再見!微信搜「JavaGuide」回覆「面試突擊」領取我整理的 4 本原創PDF