天天看點

java 反編譯之修改源代碼(包括了jar包和war包的修改方式)需求解決方式

需求

這兩天公司有一個需求就是有一個來自于别人的項目,隻有tomcat下部署的war包和一個配合程式使用的jar包,額。。。。于是狼來了(問題來了。。呵呵),我需要将class檔案反編譯成java檔案,這樣一看,很簡單啊,找個編譯軟體不就行了,但是等等,真正難點如下:

  • 批量編譯時大多數檔案或者内容可能都相對準确,但是有些内容不一定是對的,比如:我這邊有一個類傳入的參數是枚舉類型,但是編譯後。。。呵呵,成了整形的一個數值。
  • 為了降低出錯率,我選擇了隻反編譯自己要修改的類,額。。。但是又出問題了,每個類之間互相是有引用的,這導緻了類與類之間的互相依賴,如果我使用javac進行單檔案編譯,然後。。。然後就報錯了。。。。因為當你單個檔案進行編譯時找不到這個java檔案被引用的類
  • 這個還好解決,我建立了一個項目,在項目中引入了原先的jar 包項目,并建立了與該類相同的包路徑,将該類放在該路徑下,然後進行編譯就會發現編譯成功。可以具體操作可以檢視這個連結https://blog.csdn.net/tomcat_zhu/article/details/79240011
  • 但是,在tomcat下面有個web 項目仍需要進行反編譯并進行修改,由于war包部署的項目并不像jar包項目可以直接将項目引入,這樣又回到了原點,要修改的java檔案無法找到引入的類,怎麼辦呢,經過本人不斷跋山涉水,曆盡艱辛的查找,終于想到一個辦法,就是将所有的war包項目下的class檔案通過指令打成jar包後再進行引入,發現編譯成功。

解決方式

首先必須下載下傳相關的反編譯軟體,可以使用jda,jdax,Luyten等等,如下所示:

java 反編譯之修改源代碼(包括了jar包和war包的修改方式)需求解決方式

個人測試過,建議使用Luyten這個軟體反編譯的準确率相對較高一些,但是如果是中文顯示的是:Unicode編碼格式的字元串。而,jad,jadx可以完全編譯中文内容。

第二步:解壓jar包,并擷取要修改的class檔案,由于比較簡單我就不多說了

第三步:建立maven項目工程,并将擷取到的檔案放入項目中。這裡要注意一個地方,如果直接将檔案放入項目會是這個樣子

java 反編譯之修改源代碼(包括了jar包和war包的修改方式)需求解決方式

而且也會出現以下報錯:

java 反編譯之修改源代碼(包括了jar包和war包的修改方式)需求解決方式

是以要建立相同的包路徑,或者修改包路徑,正确的應該是這個樣子:

java 反編譯之修改源代碼(包括了jar包和war包的修改方式)需求解決方式

第四步:引入jar包

如果你的項目是jar包項目可以在Eclipse中直接: 右鍵項目 —— Build Path —— Add External Archives... 将原項目導入到建立的項目中。

如果是war包方式,則可以将xxx.war檔案字尾修改為xxx.zip進行解壓,如果是已經部署在tomcat則需要找到所有的java檔案,并将該檔案打包成jar包,注意:隻需要java檔案,而且一定要注意包的路徑,打包方式請檢視:https://blog.csdn.net/qq_40929531/article/details/99310180  當打包完成後按照下方步驟将jar包引入項目中
java 反編譯之修改源代碼(包括了jar包和war包的修改方式)需求解決方式

第五步:修改代碼并且将項目重新打包成jar包或者war包,通過解壓jar包或war擷取class檔案,并替換原來項目中的class檔案。