1. 程式人生 > >推薦一款IDEA神器!一鍵檢視Java位元組碼以及其他類資訊

推薦一款IDEA神器!一鍵檢視Java位元組碼以及其他類資訊

由於後面要分享的一篇文章中用到了這篇文章要推薦的一個外掛,所以這裡分享一下。非常實用!你會愛上它的! ![](https://img2020.cnblogs.com/other/1843652/202010/1843652-20201013195000028-149190655.png) **開始推薦 IDEA 位元組碼檢視神器之前,先來回顧一下 Java 位元組碼是啥。** ## 何為 Java 位元組碼? Java 虛擬機器(JVM)是執行 Java 位元組碼的虛擬機器。JVM 有針對不同系統的特定實現(Windows,Linux,macOS),目的是使用相同的位元組碼,它們都會給出相同的結果。 **什麼是位元組碼?採用位元組碼的好處是什麼?** > 在 Java 中,JVM 可以理解的程式碼就叫做`位元組碼`(即副檔名為 `.class` 的檔案),它不面向任何特定的處理器,只面向虛擬機器。Java 語言通過位元組碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。所以 Java 程式執行時比較高效,而且,由於位元組碼並不針對一種特定的機器,因此,Java 程式無須重新編譯便可在多種不同作業系統的計算機上執行。 **Java 程式從原始碼到執行一般有下面 3 步:** ![Java程式執行過程](https://img2020.cnblogs.com/other/1843652/202010/1843652-20201013195000421-1004703706.png) ## 為什麼要檢視 Java 位元組碼? 我們在平時學習的時候,經常需要檢視某個 java 類的位元組碼檔案。檢視位元組碼檔案更容易讓我們搞懂 java 程式碼背後的原理比如搞懂 java 中的各種語法糖的本質。 ## 如何檢視 Java 位元組碼? 如果我們通過命令列來檢視某個 class 的位元組碼檔案的話,可以直接通過 `javap` 命令,不過這種方式太原始了,效率十分低,並且看起來不直觀。 下面介紹兩種使用 IDEA 檢視類對應位元組碼檔案的方式(_`javap`這種方式就不提了_)。 我們以這段程式碼作為案例: ```java public class Main { public static void main(String[] args) { Integer i = null; Boolean flag = false; System.out.println(flag ? 0 : i); } } ``` 上面這段程式碼由於使用三目運算子不當導致詭異了 NPE 異常。為了搞清楚事情的原因,我們來看其對應的位元組碼。 ### 使用 IDEA 自帶功能 我們點選 `View -> Show Bytecode` 即可通過 IDEA 檢視某個類對應的位元組碼檔案。 > 需要注意的是:**檢視某個類對應的位元組碼檔案之前確保它已經被編譯過。** ![使用IDEA自帶功能檢視Java位元組碼](https://img2020.cnblogs.com/other/1843652/202010/1843652-20201013195000954-291598492.png) 稍等幾秒鐘之後,你就可以直觀到看到對應的類的位元組碼內容了。 ![](https://img2020.cnblogs.com/other/1843652/202010/1843652-20201013195001436-1883366130.png) 從位元組碼中可以看出,我圈出來的位置發生了 **拆箱操作** 。 > - **裝箱**:將基本型別用它們對應的引用型別包裝起來; > - **拆箱**:將包裝型別轉換為基本資料型別; 詳細解釋下就是:`flag ? 0 : i` 這行程式碼中,0 是基本資料型別 int,返回資料的時候 i 會被強制拆箱成 int 型別,由於 i 的值是 null,因此就丟擲了 NPE 異常。 ```java Integer i = null; Boolean flag = false; System.out.println(flag ? 0 : i); ``` 如果,我們把程式碼中 `flag` 變數的值修改為 true 的話,就不會存在 NPE 問題了,因為會直接返回 0,不會進行拆箱操作。 ### 使用 IDEA 外掛 jclasslib(推薦) 相比於 IDEA 自帶的檢視類位元組的功能,我更推薦 `jclasslib` 這個外掛,非常棒! **使用 `jclasslib` 不光可以直觀地檢視某個類對應的位元組碼檔案,還可以檢視類的基本資訊、常量池、介面、屬性、函式等資訊。** ![](https://img2020.cnblogs.com/other/1843652/202010/1843652-20201013195001890-1245831891.png) 我們直接在 IDEA 的外掛市場即可找到這個外掛。我這裡已經安裝好了。 ![](https://img2020.cnblogs.com/other/1843652/202010/1843652-20201013195002311-979759031.png) 安裝完成之後,重啟 IDEA。點選`View -> Show Bytecode With jclasslib` 即可通過`jclasslib` 檢視某個類對應的位元組碼檔案。 ![使用IDEA外掛jclasslib檢視類的位元組碼](https://img2020.cnblogs.com/other/1843652/202010/1843652-20201013195003095-1827793334.png) ### 我的開源專案推薦 1. [JavaGuide](https://github.com/Snailclimb/JavaGuide) :「Java學習+面試指南」一份涵蓋大部分Java程式設計師所需要掌握的核心知識。準備 Java 面試,首選 JavaGuide! 2. [guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) :A custom RPC framework implemented by Netty+Kyro+Zookeeper.(一款基於 Netty+Kyro+Zookeeper 實現的自定義 RPC 框架-附詳細實現過程和相關教程) 3. [jsoncat](https://github.com/Snailclimb/jsoncat) :仿 Spring Boot 但不同於 Spring Boot 的一個輕量級的 HTTP 框架 4. [programmer-advancement](https://github.com/Snailclimb/programmer-advancement) :程式設計師應該有的一些好習慣+面試必知事項! 5. [springboot-guide](https://github.com/Snailclimb/springboot-guide) :Not only Spring Boot but also important knowledge of Spring(不只是SpringBoot還有Spring重要知識點) 6. [awesome-java](https://github.com/Snailclimb/awesome-java) :Collection of awesome Java project on Github(Github 上非常棒的 Java 開源專案集合). 我整理了一份優質原創PDF資源免費分享給大家,大部分內容都是我的原創,少部分來自朋友。 下載地址:[https://cowtransfer.com/s/fbed14f0c22a4d](https://cowtransfer.com/s/fbed14f0c22a4d) 。 [我是 Guide 哥,一 Java 後端開發,會一點前端,自由的少年。我們下期再見!微信搜“**JavaGuide**”回覆“**面試突擊**”領取我整理的 4 本原創PDF](https://www.yuque.com/docs/share/71251673-1fef-416e-93d7-489a25a9eda5?#%20%E3%80%8A%E8%B5%B0%E8%BF%91JavaGuide%E