溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

怎么查看運(yùn)行中Java Class源碼的三板斧

發(fā)布時(shí)間:2021-10-23 17:47:35 來(lái)源:億速云 閱讀:171 作者:iii 欄目:編程語(yǔ)言

這篇文章主要講解了“怎么查看運(yùn)行中Java Class源碼的三板斧”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“怎么查看運(yùn)行中Java Class源碼的三板斧”吧!

線(xiàn)上跑了個(gè)應(yīng)用,總感覺(jué)運(yùn)行結(jié)果和你預(yù)期的有出入,而且代碼似乎和你本地的也不一致。這可咋辦,一咬牙,一跺腳停機(jī)重新上線(xiàn)嗎?

那是夠折騰的,我們來(lái)了解幾種不停機(jī)來(lái)查看 Java 應(yīng)用Class 源碼的方式。

像程咬金的功夫一樣,針對(duì)Class 源碼查看,我們也有三板斧。

一般我們要查看一個(gè)運(yùn)行中程序的 Class 源碼,大致會(huì)經(jīng)過(guò)這樣三步:

一、定位,找到這個(gè)Class

二、將遠(yuǎn)程 的 class 文件下載到本地

三、反編譯,查看源碼

這的過(guò)程,應(yīng)該都很清楚,我們重點(diǎn)來(lái)看第一第二步,怎樣找到這個(gè)class并下載到本地。

對(duì)于找Class 來(lái)說(shuō),如果是我們自己開(kāi)發(fā)的代碼,而不是編譯時(shí)或者運(yùn)行時(shí)增強(qiáng)以及生成的,那直接在遠(yuǎn)程服務(wù)器搜索到并下載到本地就OK了。

像那些編譯時(shí)、以及運(yùn)行時(shí)增強(qiáng)過(guò)的Class,甚至動(dòng)態(tài)生成的Class,比如像OpenJPA、Spring/Cglib 的動(dòng)態(tài)代理,  上面的辦法就無(wú)能為力了。

這種情況,可以直接用JDK 的神器 SA 工具(Java虛擬機(jī)的顯微鏡 Serviceability Agent),在 Class browser  里直接搜索,然后選擇 create .class file 文件就會(huì)默認(rèn)保存到 SA Jar 所在的目錄。不過(guò)缺點(diǎn)是,SA連接時(shí)會(huì)把應(yīng)用掛起,直到斷開(kāi)。

還有一種方法是各種增強(qiáng)的類(lèi)庫(kù),都默認(rèn)提供了保存生成類(lèi)的配置,如果此選項(xiàng)打開(kāi),就會(huì)把生成的、增強(qiáng)的class  寫(xiě)到本地。比如像Cglib,在System.property里設(shè)置即可。

System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, ".");

Cglib 運(yùn)行時(shí)判斷配置,打開(kāi)就會(huì)把生成類(lèi)的 class 二進(jìn)制文件寫(xiě)到本地。

如果類(lèi)庫(kù)沒(méi)有或者你沒(méi)找到這個(gè)選項(xiàng),又確實(shí)想要查看,那可以 Attach 一個(gè) Java Agent  到JVM上。用Instrument或者ByteBuddy免 Jar 包掛上去,參考之前的文章(不用Jar 包的Agent?幾行代碼實(shí)現(xiàn)運(yùn)行時(shí)增強(qiáng))

有了Agent 的 transformer,大顯身手就看你的了。

感謝各位的閱讀,以上就是“怎么查看運(yùn)行中Java Class源碼的三板斧”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)怎么查看運(yùn)行中Java Class源碼的三板斧這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI