由于后面要分享的一篇文章中用到了這篇文章要推薦的一個(gè)插件,所以這里分享一下兰英。非常實(shí)用撇叁!你會(huì)愛上它的!
開始推薦 IDEA 字節(jié)碼查看神器之前畦贸,先來回顧一下 Java 字節(jié)碼是啥陨闹。
何為 Java 字節(jié)碼?
Java 虛擬機(jī)(JVM)是運(yùn)行 Java 字節(jié)碼的虛擬機(jī)。JVM 有針對(duì)不同系統(tǒng)的特定實(shí)現(xiàn)(Windows薄坏,Linux正林,macOS),目的是使用相同的字節(jié)碼颤殴,它們都會(huì)給出相同的結(jié)果。
什么是字節(jié)碼?采用字節(jié)碼的好處是什么?
在 Java 中鼻忠,JVM 可以理解的代碼就叫做
字節(jié)碼
(即擴(kuò)展名為.class
的文件)涵但,它不面向任何特定的處理器杈绸,只面向虛擬機(jī)。Java 語言通過字節(jié)碼的方式矮瘟,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題瞳脓,同時(shí)又保留了解釋型語言可移植的特點(diǎn)。所以 Java 程序運(yùn)行時(shí)比較高效澈侠,而且劫侧,由于字節(jié)碼并不針對(duì)一種特定的機(jī)器,因此哨啃,Java 程序無須重新編譯便可在多種不同操作系統(tǒng)的計(jì)算機(jī)上運(yùn)行烧栋。
Java 程序從源代碼到運(yùn)行一般有下面 3 步:
為什么要查看 Java 字節(jié)碼圣拄?
我們?cè)谄綍r(shí)學(xué)習(xí)的時(shí)候完疫,經(jīng)常需要查看某個(gè) java 類的字節(jié)碼文件。查看字節(jié)碼文件更容易讓我們搞懂 java 代碼背后的原理比如搞懂 java 中的各種語法糖的本質(zhì)旨椒。
如何查看 Java 字節(jié)碼?
如果我們通過命令行來查看某個(gè) class 的字節(jié)碼文件的話祝峻,可以直接通過 javap
命令魔吐,不過這種方式太原始了,效率十分低莱找,并且看起來不直觀酬姆。
下面介紹兩種使用 IDEA 查看類對(duì)應(yīng)字節(jié)碼文件的方式(javap
這種方式就不提了)。
我們以這段代碼作為案例:
public class Main {
public static void main(String[] args) {
Integer i = null;
Boolean flag = false;
System.out.println(flag ? 0 : i);
}
}
上面這段代碼由于使用三目運(yùn)算符不當(dāng)導(dǎo)致詭異了 NPE 異常奥溺。為了搞清楚事情的原因辞色,我們來看其對(duì)應(yīng)的字節(jié)碼。
使用 IDEA 自帶功能
我們點(diǎn)擊 View -> Show Bytecode
即可通過 IDEA 查看某個(gè)類對(duì)應(yīng)的字節(jié)碼文件谚赎。
需要注意的是:查看某個(gè)類對(duì)應(yīng)的字節(jié)碼文件之前確保它已經(jīng)被編譯過淫僻。
稍等幾秒鐘之后,你就可以直觀到看到對(duì)應(yīng)的類的字節(jié)碼內(nèi)容了壶唤。
從字節(jié)碼中可以看出雳灵,我圈出來的位置發(fā)生了 拆箱操作 。
- 裝箱:將基本類型用它們對(duì)應(yīng)的引用類型包裝起來闸盔;
- 拆箱:將包裝類型轉(zhuǎn)換為基本數(shù)據(jù)類型悯辙;
詳細(xì)解釋下就是:flag ? 0 : i
這行代碼中,0 是基本數(shù)據(jù)類型 int迎吵,返回?cái)?shù)據(jù)的時(shí)候 i 會(huì)被強(qiáng)制拆箱成 int 類型躲撰,由于 i 的值是 null,因此就拋出了 NPE 異常击费。
Integer i = null;
Boolean flag = false;
System.out.println(flag ? 0 : i);
如果拢蛋,我們把代碼中 flag
變量的值修改為 true 的話,就不會(huì)存在 NPE 問題了蔫巩,因?yàn)闀?huì)直接返回 0谆棱,不會(huì)進(jìn)行拆箱操作快压。
使用 IDEA 插件 jclasslib(推薦)
相比于 IDEA 自帶的查看類字節(jié)的功能,我更推薦 jclasslib
這個(gè)插件垃瞧,非常棒蔫劣!
使用 jclasslib
不光可以直觀地查看某個(gè)類對(duì)應(yīng)的字節(jié)碼文件,還可以查看類的基本信息个从、常量池脉幢、接口、屬性嗦锐、函數(shù)等信息嫌松。
我們直接在 IDEA 的插件市場即可找到這個(gè)插件。我這里已經(jīng)安裝好了意推。
安裝完成之后豆瘫,重啟 IDEA。點(diǎn)擊View -> Show Bytecode With jclasslib
即可通過jclasslib
查看某個(gè)類對(duì)應(yīng)的字節(jié)碼文件菊值。
我的開源項(xiàng)目推薦
- JavaGuide :「Java學(xué)習(xí)+面試指南」一份涵蓋大部分Java程序員所需要掌握的核心知識(shí)外驱。準(zhǔn)備 Java 面試,首選 JavaGuide腻窒!
- guide-rpc-framework :A custom RPC framework implemented by Netty+Kyro+Zookeeper.(一款基于 Netty+Kyro+Zookeeper 實(shí)現(xiàn)的自定義 RPC 框架-附詳細(xì)實(shí)現(xiàn)過程和相關(guān)教程)
- jsoncat :仿 Spring Boot 但不同于 Spring Boot 的一個(gè)輕量級(jí)的 HTTP 框架
- programmer-advancement :程序員應(yīng)該有的一些好習(xí)慣+面試必知事項(xiàng)昵宇!
- springboot-guide :Not only Spring Boot but also important knowledge of Spring(不只是SpringBoot還有Spring重要知識(shí)點(diǎn))
- awesome-java :Collection of awesome Java project on Github(Github 上非常棒的 Java 開源項(xiàng)目集合).
我整理了一份優(yōu)質(zhì)原創(chuàng)PDF資源免費(fèi)分享給大家,大部分內(nèi)容都是我的原創(chuàng)儿子,少部分來自朋友瓦哎。
<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 。
作者介紹: Github 70k Star 項(xiàng)目 JavaGuide(公眾號(hào)同名) 作者柔逼。每周都會(huì)在公眾號(hào)更新一些自己原創(chuàng)干貨蒋譬。公眾hao后臺(tái)回復(fù)“1”領(lǐng)取Java工程師必備學(xué)習(xí)資料+面試突擊pdf。