Java 如何覆蓋第三方 jar 包中的類

目錄

    • 一、需求描述
    • 二、示例描述
    • 三、操作步驟
    • 四、驗證結果
    • 五、實現原理

背景:

在我們日常的開發中,經常需要使用第三方的 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)會按照以下順序加載類和資源:

  1. 優先加載 BOOT-INF/classes 中的類和資源:這是你的應用程序代碼所在的位置。Spring Boot首先從這里加載類和資源。
  2. 然后加載 BOOT-INF/lib 中的依賴 JAR 文件:這些是你的應用程序所依賴的所有外部庫。

整理完畢,完結撒花~🌻





參考地址:

1.java 覆蓋 jar 包的 類_覆蓋第三方jar包中的某一個類。妙!!https://blog.csdn.net/weixin_39706441/article/details/114098373

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/68141.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/68141.shtml
英文地址,請注明出處:http://en.pswp.cn/web/68141.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CS 與 BS 架構的差異

在數字化的今天&#xff0c;選擇軟件架構模式對系統的性能、維護、安全和成本都有很大影響。BS架構和CS架構是最常見的兩種模式&#xff0c;了解它們的區別和特點對開發人員和企業決策者都很重要。 CS架構最早出現&#xff0c;當時用戶直接從主機獲取數據。隨著客戶端和服務端…

HTML之table表格學習

HTML table使用 thead、tbody、tfoot均可省略&#xff1b; 瀏覽器解析的時候會自動套上tbody tr 行 td 列 th 標題列屬性 colspan 列占用數 rowspan 行占用數 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8">…

常用抓包工具tcpdump、Fiddler、Charles、Wireshark 和 Sniffmaster 下載地址

抓包大師官網下載地址 Sniff Master Download - Free TCP and HTTPS Proxy Sniffing Tool, Supports IOS Sniffing Fiddler classic官網下載地址 Download Fiddler Web Debugging Tool for Free by Telerik Fiddler Everywhere官網下載地址 The Ultimate Web Debugging Tool …

【PostgreSQL內核學習 —— (WindowAgg(二))】

WindowAgg WindowAggState 結構體窗口聚合行為ExecInitWindowAgg 函數ExecWindowAgg 函數代碼邏輯解釋&#xff1a;計算窗口偏移量代碼邏輯詳細解釋&#xff1a; 代碼邏輯解釋&#xff1a;窗口聚合分區初始化與行推進邏輯代碼邏輯詳細解釋&#xff1a; 代碼邏輯解釋&#xff1a…

區塊鏈項目孵化與包裝設計:從概念到市場的全流程指南

區塊鏈技術的快速發展催生了大量創新項目&#xff0c;但如何將一個區塊鏈項目從概念孵化成市場認可的產品&#xff0c;是許多團隊面臨的挑戰。本文將從孵化策略、包裝設計和市場落地三個維度&#xff0c;為你解析區塊鏈項目成功的關鍵步驟。 一、區塊鏈項目孵化的核心要素 明確…

【React】受控組件和非受控組件

目錄 受控組件非受控組件基于ref獲取DOM元素1、在標簽中使用2、在組件中使用 受控組件 表單元素的狀態&#xff08;值&#xff09;由 React 組件的 state 完全控制。組件的 state 保存了表單元素的值&#xff0c;并且每次用戶輸入時&#xff0c;React 通過事件處理程序來更新 …

C#開發的進銷存管理系統軟件

#### 介紹 進銷存管理系統實現的功能及用途 含模塊銷售管理、采購管理、存貨管理、庫存管理、賬款管理、用戶管理、職員管理七個部分 進銷存管理系統實現以下功能&#xff1a; 1. 庫存管理 2. 應付賬款和應收賬款的統計 3. 對訂單未結數量和采購單未結數量的統計 4. 權限的管理…

高性能 AI 處理器親和性調度算法實現

目錄 題目描述解題思路分析C 語言實現 生成組合的函數主程序實現C 語言代碼使用示例Python 實現 生成組合的函數主程序實現Python 代碼使用示例總結與展望題目描述 某公司研發的高性能 AI 處理器,每臺物理設備 a 包含 8 顆 AI 處理器,編號為 0 - 7。其中,編號 0 - 3 的處理…

快手ip屬地是定位嗎?怎么改

在當今數字化時代&#xff0c;隨著網絡平臺的不斷發展&#xff0c;用戶隱私和數據安全成為了公眾關注的焦點。各大社交媒體平臺紛紛推出的“IP屬地”功能&#xff0c;無疑為網絡環境增添了一抹新的色彩。其中&#xff0c;快手的IP屬地顯示功能尤為引人注目。那么&#xff0c;快…

Git 常用基礎命令詳解:init、add、commit

一、引言 在軟件開發的世界里&#xff0c;版本控制是一項至關重要的技術&#xff0c;它就像是一個時光機器&#xff0c;讓開發者能夠追蹤代碼的每一次變化&#xff0c;輕松回溯到任意歷史版本&#xff0c;同時也為多人協作開發提供了強大的支持。而 Git&#xff0c;作為目前最…

1-kafka服務端之延時操作前傳--時間輪

文章目錄 背景時間輪層級時間輪時間輪降級kafka中的時間輪kafka如何進行時間輪運行 背景 Kafka中存在大量的延時操作&#xff0c;比如延時生產、延時拉取和延時刪除等。Kafka并沒有使用JDK自帶的Timer或DelayQueue來實現延時的功能&#xff0c;而是基于時間輪的概念自定義實現…

從零開始:OpenCV 圖像處理快速入門教程

文章大綱 第1章 OpenCV 概述 1.1 OpenCV的模塊與功能  1.2 OpenCV的發展 1.3 OpenCV的應用 第2章 基本數據類型 2.1 cv::Vec類 2.2 cv&#xff1a;&#xff1a;Point類 2.3 cv&#xff1a;&#xff1a;Rng類 2.4 cv&#xff1a;&#xff1a;Size類 2.5 cv&#xff1a;&…

網絡工程師 (22)網絡協議

前言 網絡協議是計算機網絡中進行數據交換而建立的規則、標準或約定的集合&#xff0c;它規定了通信時信息必須采用的格式和這些格式的意義。 一、基本要素 語法&#xff1a;規定信息格式&#xff0c;包括數據及控制信息的格式、編碼及信號電平等。這是協議的基礎&#xff0c;確…

vue如何解決跨域

文章目錄 vue如何解決跨域1. 什么是跨域2. 如何解決2.1 CROS&#xff08;Cross-Origin Resource Sharing&#xff0c;跨域資源共享&#xff09;2.2 Proxy2.2.1 使用webpack proxy2.2.2 服務端代理轉發2.2.3 通過nginx實現代理 vue如何解決跨域 1. 什么是跨域 跨域本質是瀏覽器…

算法與數據結構(括號匹配問題)

思路 從題干可以看出&#xff0c;只要給出的括號對應關系正確&#xff0c;那么就可以返回true,否則返回false。這個題可以使用棧來解決 解題過程 首先從第一個字符開始遍歷&#xff0c;如果是括號的左邊&#xff08;‘&#xff08;‘&#xff0c;’[‘&#xff0c;’}‘&…

在linux 中搭建deepseek 做微調,硬件配置要求說明

搭建 可參考 使用deepseek-CSDN博客 官方網站&#xff1a;DeepSeek DeepSeek 是一個基于深度學習的開源項目&#xff0c;旨在通過深度學習技術來提升搜索引擎的準確性和效率。如果你想在 Linux 系統上搭建 DeepSeek&#xff0c;你可以遵循以下步驟。這里我將提供一個基本的指…

mounted鉤子函數里如何操作子組件的DOM?

在 Vue 的 mounted 鉤子函數中,操作子組件的 DOM 可以通過幾種方式實現,具體取決于對子組件的訪問方式。以下是一些常用的方法: 一、使用 ref 引用 定義 ref在父組件中,給子組件添加一個 ref 屬性,這樣就可以在父組件中通過 this.$refs 訪問到子組件的實例。 父組件示例…

vue2-為啥data屬性是一個函數而不是對象

vue2-為啥data屬性是一個函數而不是對象 1. data在vue實例和組件中的表現差異 vue實例的時候&#xff0c;data既可以是一個對象也可以是一個函數 new Vue({data:{//對象name:tom},data(){//函數return{name:tom}} })而在組件中定義data&#xff0c;只能是函數&#xff0c;如…

利用deepseek參與軟件測試 基本架構如何 又該在什么環節接入deepseek

利用DeepSeek參與軟件測試&#xff0c;可以考慮以下基本架構和接入環節&#xff1a; ### 基本架構 - **數據層** - **測試數據存儲**&#xff1a;用于存放各種測試數據&#xff0c;包括正常輸入數據、邊界值數據、異常數據等&#xff0c;這些數據可以作為DeepSeek的輸入&…

Word List 2

詞匯顏色標識解釋 詞匯表中的生詞 詞匯表中的詞組成的搭配、派生詞 例句中的生詞 我自己寫的生詞&#xff08;用于區分易混淆的詞&#xff0c;無顏色標識&#xff09; 不認識的單詞或句式 單詞的主要漢語意思 不太理解的句子語法和結構 Word List 2 英文音標中文regi…