目錄
- 一、需求描述
- 二、示例描述
- 三、操作步驟
- 四、驗證結果
- 五、實現原理
背景:
在我們日常的開發中,經常需要使用第三方的 jar 包,有時候我們會發現第三方的 jar 包中的某一個類有問題,或者我們需要定制化修改其中的邏輯,那么應該如何實現呢?
一、需求描述
需求描述如下:
- 需要在阿里的
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()
方法,可以查看方法的底層實現,在右上角會出現一個 Download Sources
按鈕,點擊下載源碼。
下載后,需要在項目中創建出 一模一樣的包結構,可以看到這個類的包是 com.alibaba.fastjson
。
然后在創建好的包結構下面新建 一個一模一樣的類名,即 JSON
。
然后我們把之前的源碼內容全部復制粘貼到新建的 JSON 類中,并加入一行日志,如下所示:
操作完畢之后,我們就可以再次執行代碼進行驗證了。
四、驗證結果
重新執行我們的示例代碼,結果如下:
可以看到我們的 JSON 代碼已經覆蓋了原有 jar 包里面的類。
五、實現原理
不光要知其然,還要知其所以然。
在 Java 項目中,通過相同的包結構和類名來覆蓋引入以來中的類和方法邏輯,主要利用了 Java 類加載機制中的 類加載器(ClassLoader) 和 類路徑優先級。
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):可以自行創建定制的類加載器。
假設你有一個典型的Spring Boot項目結構如下:
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
)會按照以下順序加載類和資源:
- 優先加載
BOOT-INF/classes
中的類和資源:這是你的應用程序代碼所在的位置。Spring Boot首先從這里加載類和資源。 - 然后加載
BOOT-INF/lib
中的依賴 JAR 文件:這些是你的應用程序所依賴的所有外部庫。
整理完畢,完結撒花~🌻
參考地址:
1.java 覆蓋 jar 包的 類_覆蓋第三方jar包中的某一個類。妙!!https://blog.csdn.net/weixin_39706441/article/details/114098373