Java覆蓋第三方j(luò)ar包中的某一個(gè)類的實(shí)現(xiàn)方法
一、需求描述
需求描述如下:
- 需要在阿里的
fastjson
工具包的序列化過程中增加一行日志。
二、示例描述
Maven依賴:
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.78</version> </dependency>
使用代碼示例:
import com.alibaba.fastjson.JSONObject; import java.util.HashMap; import java.util.Map; public class TestController { public static void main(String[] args) { Map<String, Object> map = new HashMap<>(); map.put("name", "ACGkaka"); map.put("age", 18); String s = JSONObject.toJSONString(map); System.out.println("result: " + s); } }
三、操作步驟
在 IDEA 中,按住 Ctrl 之后點(diǎn)擊 JSONObject.toJSONString()
方法,可以查看方法的底層實(shí)現(xiàn),在右上角會(huì)出現(xiàn)一個(gè) Download Sources
按鈕,點(diǎn)擊下載源碼。
下載后,需要在項(xiàng)目中創(chuàng)建出 一模一樣的包結(jié)構(gòu),可以看到這個(gè)類的包是 com.alibaba.fastjson
。
然后在創(chuàng)建好的包結(jié)構(gòu)下面新建 一個(gè)一模一樣的類名,即 JSON
。
然后我們把之前的源碼內(nèi)容全部復(fù)制粘貼到新建的 JSON 類中,并加入一行日志,如下所示:
操作完畢之后,我們就可以再次執(zhí)行代碼進(jìn)行驗(yàn)證了。
四、驗(yàn)證結(jié)果
重新執(zhí)行我們的示例代碼,結(jié)果如下:
可以看到我們的 JSON 代碼已經(jīng)覆蓋了原有 jar 包里面的類。
五、實(shí)現(xiàn)原理
不光要知其然,還要知其所以然。
在 Java 項(xiàng)目中,通過相同的包結(jié)構(gòu)和類名來覆蓋引入以來中的類和方法邏輯,主要利用了 Java 類加載機(jī)制中的 類加載器(ClassLoader) 和 類路徑優(yōu)先級(jí)。
Java 使用 類加載器(ClassLoader)來加載類文件。類加載器遵循 雙親委派模型(Parent Delegation Model),即:
- 當(dāng)一個(gè)類加載器收到類加載請(qǐng)求時(shí),首先將請(qǐng)求委派給父類加載器,只有當(dāng)父類加載器無法找到該類時(shí),才會(huì)嘗試自己加載。
- 啟動(dòng)類加載器(Bootstrap ClassLoader):負(fù)責(zé)加載核心Java庫(如
rt.jar
),這些庫位于JDK的jre/lib
目錄下。 - 擴(kuò)展類加載器(Extension ClassLoader):負(fù)責(zé)加載Java擴(kuò)展庫(如
jce.jar
),這些庫位于JDK的jre/lib/ext
目錄下。 - 應(yīng)用類加載器(Application ClassLoader):負(fù)責(zé)加載應(yīng)用程序的類路徑(classpath)下的類和資源。這是最常見的類加載器,用于加載用戶定義的類以及通過依賴管理工具(如Maven、Gradle)引入的外部庫。
- 自定義類加載(CustomizeClassLoader):可以自行創(chuàng)建定制的類加載器。
假設(shè)你有一個(gè)典型的Spring Boot項(xiàng)目結(jié)構(gòu)如下:
my-app.jar ├── META-INF │ └── MANIFEST.MF ├── BOOT-INF │ ├── classes │ │ └── com │ │ └── example │ │ └── MyApplication.class │ └── lib │ ├── spring-boot-starter-web-2.6.0.jar │ ├── spring-core-5.3.14.jar │ └── ... (其他依賴JAR文件) └── org └── springframework └── boot └── loader └── JarLauncher.class
Spring Boot使用了一個(gè)名為 LaunchedURLClassLoader(或其子類)的自定義類加載器來加載嵌入式JAR文件中的類和資源。具體來說,Spring Boot的啟動(dòng)引導(dǎo)類(如JarLauncher
)會(huì)按照以下順序加載類和資源:
- 優(yōu)先加載
BOOT-INF/classes
中的類和資源:這是你的應(yīng)用程序代碼所在的位置。Spring Boot首先從這里加載類和資源。 - 然后加載
BOOT-INF/lib
中的依賴 JAR 文件:這些是你的應(yīng)用程序所依賴的所有外部庫。
到此這篇關(guān)于Java覆蓋第三方j(luò)ar包中的某一個(gè)類的實(shí)現(xiàn)方法的文章就介紹到這了,更多相關(guān)Java覆蓋第三方j(luò)ar包中的類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java實(shí)現(xiàn)的MD5摘要算法完整實(shí)例
這篇文章主要介紹了java實(shí)現(xiàn)的MD5摘要算法,結(jié)合完整實(shí)例形式分析了java實(shí)現(xiàn)md5單項(xiàng)加密的具體步驟與相關(guān)操作技巧,需要的朋友可以參考下2017-01-01Spring Cache監(jiān)控配置與使用規(guī)范的建議
這篇文章主要介紹了Spring Cache監(jiān)控配置與使用規(guī)范的建議,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Java并發(fā)編程之Semaphore(信號(hào)量)詳解及實(shí)例
這篇文章主要介紹了Java并發(fā)編程之Semaphore(信號(hào)量)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-06-06Spring?Boot整合阿里開源中間件Canal實(shí)現(xiàn)數(shù)據(jù)增量同步
這篇文章主要為大家介紹了Spring?Boot整合阿里開源中間件Canal實(shí)現(xiàn)數(shù)據(jù)增量同步示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06