IDEA神器一鍵查看Java字節(jié)碼及其他類(lèi)信息插件

開(kāi)始推薦 IDEA 字節(jié)碼查看神器之前,先來(lái)回顧一下 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é)碼的文件),它不面向任何特定的處理器,只面向虛擬機(jī)。Java 語(yǔ)言通過(guò)字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語(yǔ)言執(zhí)行效率低的問(wèn)題,同時(shí)又保留了解釋型語(yǔ)言可移植的特點(diǎn)。所以 Java 程序運(yùn)行時(shí)比較高效,而且,由于字節(jié)碼并不針對(duì)一種特定的機(jī)器,因此,Java 程序無(wú)須重新編譯便可在多種不同操作系統(tǒng)的計(jì)算機(jī)上運(yùn)行。
Java 程序從源代碼到運(yùn)行一般有下面 3 步:

為什么要查看 Java 字節(jié)碼?
我們?cè)谄綍r(shí)學(xué)習(xí)的時(shí)候,經(jīng)常需要查看某個(gè) java 類(lèi)的字節(jié)碼文件。查看字節(jié)碼文件更容易讓我們搞懂 java 代碼背后的原理比如搞懂 java 中的各種語(yǔ)法糖的本質(zhì)。
如何查看 Java 字節(jié)碼?
如果我們通過(guò)命令行來(lái)查看某個(gè) class 的字節(jié)碼文件的話,可以直接通過(guò) javap 命令,不過(guò)這種方式太原始了,效率十分低,并且看起來(lái)不直觀。
下面介紹兩種使用 IDEA 查看類(lèi)對(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 異常。為了搞清楚事情的原因,我們來(lái)看其對(duì)應(yīng)的字節(jié)碼。
使用 IDEA 自帶功能
我們點(diǎn)擊 View -> Show Bytecode 即可通過(guò) IDEA 查看某個(gè)類(lèi)對(duì)應(yīng)的字節(jié)碼文件。
需要注意的是:查看某個(gè)類(lèi)對(duì)應(yīng)的字節(jié)碼文件之前確保它已經(jīng)被編譯過(guò)。

稍等幾秒鐘之后,你就可以直觀到看到對(duì)應(yīng)的類(lèi)的字節(jié)碼內(nèi)容了。

從字節(jié)碼中可以看出,我圈出來(lái)的位置發(fā)生了 拆箱操作 。
- 裝箱:將基本類(lèi)型用它們對(duì)應(yīng)的引用類(lèi)型包裝起來(lái);
- 拆箱:將包裝類(lèi)型轉(zhuǎn)換為基本數(shù)據(jù)類(lèi)型;
詳細(xì)解釋下就是:flag ? 0 : i 這行代碼中,0 是基本數(shù)據(jù)類(lèi)型 int,返回?cái)?shù)據(jù)的時(shí)候 i 會(huì)被強(qiáng)制拆箱成 int 類(lèi)型,由于 i 的值是 null,因此就拋出了 NPE 異常。
Integer?i?=?null; Boolean?flag?=?false; System.out.println(flag???0?:?i);
如果,我們把代碼中 flag 變量的值修改為 true 的話,就不會(huì)存在 NPE 問(wèn)題了,因?yàn)闀?huì)直接返回 0,不會(huì)進(jìn)行拆箱操作。
使用 IDEA 插件 jclasslib(推薦)
相比于 IDEA 自帶的查看類(lèi)字節(jié)的功能,我更推薦 jclasslib 這個(gè)插件,非常棒!
使用 jclasslib 不光可以直觀地查看某個(gè)類(lèi)對(duì)應(yīng)的字節(jié)碼文件,還可以查看類(lèi)的基本信息、常量池、接口、屬性、函數(shù)等信息。

我們直接在 IDEA 的插件市場(chǎng)即可找到這個(gè)插件。我這里已經(jīng)安裝好了。

安裝完成之后,重啟 IDEA。點(diǎn)擊View -> Show Bytecode With jclasslib 即可通過(guò)jclasslib 查看某個(gè)類(lèi)對(duì)應(yīng)的字節(jié)碼文件。

后記
工作需要,調(diào)研了桌面端開(kāi)發(fā)常用的一些技術(shù)棧,分享出來(lái),供需要的小伙伴參考。

以上就是IDEA神器一鍵查看Java字節(jié)碼及其他類(lèi)信息的詳細(xì)內(nèi)容,更多關(guān)于IDEA查看Java字節(jié)碼及其他類(lèi)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot實(shí)現(xiàn)熱部署的方式總結(jié)
所謂熱部署,就是在應(yīng)用正在運(yùn)行的時(shí)候升級(jí)軟件,卻不需要重新啟動(dòng)應(yīng)用,對(duì)于Java來(lái)說(shuō),熱部署就是在運(yùn)行時(shí)更新Java類(lèi)文件,本文將深入探討SpringBoot有哪些方式可以實(shí)現(xiàn)熱部署,感興趣的朋友可以小編一探討學(xué)習(xí)2023-06-06
SpringBoot使用SOFA-Lookout監(jiān)控的方法
本文介紹SpringBoot使用螞蟻金服SOFA-Lookout配合Prometheus進(jìn)行監(jiān)控,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-03-03
詳解Java Proxy動(dòng)態(tài)代理機(jī)制
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著Java動(dòng)態(tài)代理機(jī)制展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
SpringBoot的ResponseEntity類(lèi)返回給前端具體講解
這篇文章主要給大家介紹了關(guān)于SpringBoot的ResponseEntity類(lèi)返回給前端的相關(guān)資料,ResponseEntity是Spring框架中用于封裝HTTP響應(yīng)的類(lèi),可以自定義狀態(tài)碼、響應(yīng)頭和響應(yīng)體,常用于控制器方法中返回特定數(shù)據(jù)的HTTP響應(yīng),需要的朋友可以參考下2024-11-11
spring boot實(shí)現(xiàn)驗(yàn)證碼功能
Spring Boot是由Pivotal團(tuán)隊(duì)提供的全新框架,其設(shè)計(jì)目的是用來(lái)簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開(kāi)發(fā)過(guò)程。這篇文章主要介紹了spring boot實(shí)現(xiàn)驗(yàn)證碼功能,需要的朋友可以參考下2018-04-04
springboot實(shí)現(xiàn)郵箱驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)郵箱驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02

