介紹一個超好用的反編譯工具

介紹一個超好用的反編譯工具


背景

最近和同事在排查問題的過程中,需要用到反編譯工具,因為不同環境表現的場景不一樣,雖然通過deployed到私服的項目包各個場景應當代碼都是一致的,但是抱著懷疑的心態還是試試,首先把maven 上的jar下載下來之後,用常見的反編譯工具jd-gui.exe去打開它,找到我們懷疑的那個類,一看就懵逼了,編譯不出來了,當時一想,尼瑪是不是打的包有問題的,正好有個環境也是報錯,是不是這個問題呀~ 給大家上上圖

介紹一個超好用的反編譯工具


說實話當時還是比較慌得,因為以前還沒遇到這種情況,然後立馬叫他把本地的那個項目install一下,然後用反編譯工具打開試試,因為本地install的話jar包是編譯完拷貝到本地maven倉庫了,於是我們打開反編譯工具查看,和私服上的情況一樣,其他的類都正常,就那個類反編譯不了,這時我才鬆了一口氣,因為本地項目都是正常的,雖然問題也確實出錯在這個類上,但並不一定是打包有問題,很有可能是這個反編譯工具有問題,筆者通過查閱資料,發現網絡上搜索的最新版本大都是1.4.0,停留在2015年,抱著謹慎的態度,看到一個標題為2017.8.1最新版的,然後解壓出來是這樣:

介紹一個超好用的反編譯工具


看軟件時間就知道是假的了

隨著jdk的不斷升級,反編譯不出來的問題可能是會存在的,我還是想找找可能是哪些代碼引起的,於是找到了這麼一行代碼

 sysConfigs.forEach(sysConfig -> result.put(sysConfig.getName(), sysConfig.getValue()));

相信有同學已經猜出這是哪個版本的語法了~

解決工具

還是不放棄的,於是想尋找替代品,通過不懈的努力,終於找到我想要的工具:Luyten

Luyten是一款很強大的反編譯工具包,是一款github的開源工具,軟件功能非常強大,界面簡潔明晰、操作方便快捷,設計得很人性化。

工具軟件下載路徑:https://github.com/deathmarine/Luyten/releases/tag/v0.5.3

我比較喜歡直接使用.jar版本,直接在頁面打開目標.class或者.jar包文件,即可直觀的查看反編譯後的源碼,很強大

下載下來後雙擊就可以使用了,同樣的jar,我們打開試試效果:

介紹一個超好用的反編譯工具

總結

不再是ERROR了,同樣在使用過程中可以總結一下它和jd-gui的區別:

1.查看jar包的時候,jd-gui是摺疊的,而Luyten是展開的

2.以前在用jd-gui反編譯的時候,泛型是會被擦除的,如:

 List 
list =newArrayList();

編譯後會變成

 List list =newArrayList();

因為泛型在編譯期會被擦除,這個沒毛病,但是Luyten反編譯後的為什麼沒有被擦除呢?是因為jdk在編譯過程中雖然擦除了泛型,但是還是通過註釋對其進行了標記,如:

#4 // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;

這就解釋的通為什麼Luyten還是能夠找回來沒擦除之前的類型,畢竟能迴歸最原始的文件對程序員越有利。

雖然不是jar的問題,但是問題我們還是解決了,也是非常有意思的問題,可能這種現象你代碼裡有但是還遇不到這種場景和報錯,下次給大家講講~

原作者:小葵花哥哥轉載請註明出處,商業用途請於作者聯繫!


分享到:


相關文章: