java如何反編譯jar包并修改class文件重新打包
反編譯jar包并修改class文件重新打包
這兩天碰到一個(gè)需求:需要修改一個(gè)jar包中的邏輯代碼,并且重新打包
本來是很簡(jiǎn)單的問題,但是因?yàn)檫@個(gè)jar包不是可執(zhí)行的jar包(沒有main方法入口),jar反編譯之后又是不能通過idea重新打包,因?yàn)閖ar是混亂的
所以費(fèi)了點(diǎn)時(shí)間,在此記錄下
解決思路
反編譯jar包
首先用一些反編譯工具類似 jad-gui 之類的 ,將項(xiàng)目反編譯成java文件包
示例的jar包并不是業(yè)務(wù)真正使用,只是寫博客demo,假設(shè)這個(gè)包就叫 demo.jar
這時(shí)候?qū)С鰹閖ava文件即可
用javac 編譯成class文件
注意這里容易出問題,因?yàn)楫?dāng)前java文件可能有一些依賴其他jar包的代碼,那就需要一個(gè)一個(gè)引入
# 最后必須以 : 結(jié)束 # 如果有編譯問題可以嘗試 -Xlint:unchecked 這個(gè)參數(shù) javac -classpath demo.jar:依賴jar包路徑1:依賴jar包路徑2: Demo.java
此時(shí)會(huì)在當(dāng)前運(yùn)行目錄下生成 Demo.class
此時(shí)目錄結(jié)構(gòu)如下(請(qǐng)忽略和上圖jad-gui的不匹配)
- demo ? - META-INF ? ? MANIFEST.MF ? - com ? ? - demo ? ? ? demo.class
打jar包
# 在demo文件夾下運(yùn)行 # 最后這個(gè) . 代表當(dāng)前目錄所有文件 jar cvfm Demo.jar META-INF/MANIFEST.MF .
大功告成 :
jar包反編譯后修改源碼再編譯
1. 場(chǎng)景
需要對(duì)當(dāng)前的jar包功能進(jìn)行修改,但是沒有源碼
兩種方式:
- 通過反編譯軟件如JD-GUI或其他Java開發(fā)常用的IDE如IDEA查看源代碼,創(chuàng)建新工程,按照文件結(jié)構(gòu)逐個(gè)將文件源碼復(fù)制粘貼到工程中,再根據(jù)個(gè)人需求進(jìn)行修改、編譯等。
- 通過反編譯軟件JD-GUI直接保存成源碼格式的工程文件,再通過IDEA打開工程,進(jìn)行必要的配置后,再根據(jù)需求進(jìn)行修改編譯。
很明顯第一種方式比較費(fèi)時(shí),選用第二種方式。
2. 詳細(xì)步驟
2.1 查看源碼
如果僅僅是查看源代碼的話,有兩種方式:
方式一:
直接通過jd-gui打開jar文件即可。
方式二:
通過IDEA的External Libraries查看。在IDEA中通過Project Structure將需要查看的jar包添加到Libraries,之后就可以查看了。
第二種方式雖然稍微麻煩一點(diǎn),但如果只是查看源碼的話,個(gè)人更傾向第二種。
2.2 生成源文件
借助jd-gui可以直接生成**.java**源文件。通過菜單File -> Save All Sources就可以生成源文件壓縮包。
注:查看生成的源碼文件中有一些多余的注釋,如行號(hào)及一些元數(shù)據(jù)信息,可以通過修改jd-gui的偏好設(shè)置重新生成。
2.3 構(gòu)建項(xiàng)目
通過IDEA直接打開源文件;
創(chuàng)建src目錄,將源文件方法到src下,根據(jù)報(bào)錯(cuò)信息,修改工程的外部引用;
2.4 編譯成jar包
兩種類型可以選擇:Empty可以不設(shè)置主類,適用于編譯沒有主類的jar包;
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Spring Cloud Netflix Zuul中的速率限制
這篇文章主要介紹了詳解Spring Cloud Netflix Zuul中的速率限制,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-11-11EasyUi+Spring Data 實(shí)現(xiàn)按條件分頁查詢的實(shí)例代碼
這篇文章主要介紹了EasyUi+Spring Data 實(shí)現(xiàn)按條件分頁查詢的實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-07-07Java實(shí)現(xiàn)將html字符串插入到PPT幻燈片
Java后端代碼操作PPT幻燈片時(shí),可直接在幻燈片中繪制形狀,并在形狀中添加文本字符串內(nèi)容。本篇文章主要介紹通過java實(shí)現(xiàn)將html字符串添加到PPT幻燈片的的方法,可添加文字、圖片、視頻、音頻等。以下是具體方法和步驟。2021-11-11自從在 IDEA 中用了熱部署神器 JRebel 之后,開發(fā)效率提升了 10(真棒)
在javaweb開發(fā)過程中,使用熱部署神器 JRebel可以使class類還是更新spring配置文件都能立馬見到效率,本文給大家介紹JRebel的兩種安裝方法,小編建議使用第二種方法,具體安裝步驟跟隨小編一起看看吧2021-06-06Java線程之間數(shù)據(jù)傳遞的實(shí)現(xiàn)示例(4種)
我們經(jīng)常會(huì)遇到父子線程數(shù)據(jù)傳遞(非調(diào)用參數(shù))的場(chǎng)景,本文主要介紹了Java線程之間數(shù)據(jù)傳遞的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-08-08java實(shí)現(xiàn)簡(jiǎn)單的汽車租賃系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單的汽車租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Spring Cloud如何使用Feign構(gòu)造多參數(shù)的請(qǐng)求
這篇文章主要介紹了Spring Cloud如何使用Feign構(gòu)造多參數(shù)的請(qǐng)求,以GET以及POST方法的請(qǐng)求為例進(jìn)行講解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03