Java覆蓋第三方jar包中的某一個類的實現(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 之后點擊 JSONObject.toJSONString() 方法,可以查看方法的底層實現(xiàn),在右上角會出現(xiàn)一個 Download Sources 按鈕,點擊下載源碼。

下載后,需要在項目中創(chuàng)建出 一模一樣的包結(jié)構(gòu),可以看到這個類的包是 com.alibaba.fastjson。

然后在創(chuàng)建好的包結(jié)構(gòu)下面新建 一個一模一樣的類名,即 JSON 。

然后我們把之前的源碼內(nèi)容全部復制粘貼到新建的 JSON 類中,并加入一行日志,如下所示:

操作完畢之后,我們就可以再次執(zhí)行代碼進行驗證了。
四、驗證結(jié)果
重新執(zhí)行我們的示例代碼,結(jié)果如下:

可以看到我們的 JSON 代碼已經(jīng)覆蓋了原有 jar 包里面的類。
五、實現(xiàn)原理
不光要知其然,還要知其所以然。
在 Java 項目中,通過相同的包結(jié)構(gòu)和類名來覆蓋引入以來中的類和方法邏輯,主要利用了 Java 類加載機制中的 類加載器(ClassLoader) 和 類路徑優(yōu)先級。
Java 使用 類加載器(ClassLoader)來加載類文件。類加載器遵循 雙親委派模型(Parent Delegation Model),即:
- 當一個類加載器收到類加載請求時,首先將請求委派給父類加載器,只有當父類加載器無法找到該類時,才會嘗試自己加載。

- 啟動類加載器(Bootstrap ClassLoader):負責加載核心Java庫(如
rt.jar),這些庫位于JDK的jre/lib目錄下。 - 擴展類加載器(Extension ClassLoader):負責加載Java擴展庫(如
jce.jar),這些庫位于JDK的jre/lib/ext目錄下。 - 應用類加載器(Application ClassLoader):負責加載應用程序的類路徑(classpath)下的類和資源。這是最常見的類加載器,用于加載用戶定義的類以及通過依賴管理工具(如Maven、Gradle)引入的外部庫。
- 自定義類加載(CustomizeClassLoader):可以自行創(chuàng)建定制的類加載器。
假設你有一個典型的Spring Boot項目結(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使用了一個名為 LaunchedURLClassLoader(或其子類)的自定義類加載器來加載嵌入式JAR文件中的類和資源。具體來說,Spring Boot的啟動引導類(如JarLauncher)會按照以下順序加載類和資源:
- 優(yōu)先加載
BOOT-INF/classes中的類和資源:這是你的應用程序代碼所在的位置。Spring Boot首先從這里加載類和資源。 - 然后加載
BOOT-INF/lib中的依賴 JAR 文件:這些是你的應用程序所依賴的所有外部庫。
到此這篇關(guān)于Java覆蓋第三方jar包中的某一個類的實現(xiàn)方法的文章就介紹到這了,更多相關(guān)Java覆蓋第三方jar包中的類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Springboot如何通過注解實現(xiàn)接口防刷
本文主要為大家介紹一種極簡潔、靈活通用接口防刷實現(xiàn)方式、通過在需要防刷的方法加上@Prevent?注解即可實現(xiàn)短信防刷,感興趣的可以了解一下2022-09-09
Flowable整合SpringBoot實現(xiàn)的示例代碼
本文詳細介紹了如何在SpringBoot項目中整合Flowable進行工作流管理,包括依賴引入、流程部署與啟動、表結(jié)構(gòu)、流程掛起和激活以及任務分配等關(guān)鍵操作,具有一定的參考價值,感興趣的可以了解一下2024-09-09
SpringBoot使用自定義注解+AOP+Redis實現(xiàn)接口限流的實例代碼
這篇文章主要介紹了SpringBoot使用自定義注解+AOP+Redis實現(xiàn)接口限流,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
簡介Java的Hibernate框架中的Session和持久化類
這篇文章主要介紹了Java的Hibernate框架中的Session和持久化類,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12
springboot整合JSR303校驗功能實現(xiàn)代碼
這篇文章主要介紹了springboot整合JSR303校驗功能實現(xiàn),JSR303校驗方法有統(tǒng)一校驗的需求,統(tǒng)一校驗實現(xiàn)以及分組校驗,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2023-01-01

