曉知識: 動態代理與靜態代理的區別

動態代理與靜態代理的區別

代理模式是一種常見的設計模式,用于在不修改原始類的情況下擴展其功能。代理分為靜態代理和動態代理兩種,它們在實現方式、適用場景和靈活性上有顯著差異。

靜態代理

靜態代理在編譯時就已經確定代理類和被代理類的關系。代理類和被代理類實現相同的接口或繼承相同的父類,代理類在調用被代理類方法前后可以添加額外的邏輯。

  • 實現方式:需要手動編寫代理類,顯式調用被代理對象的方法。
  • 優點:結構簡單,容易理解和實現。
  • 缺點:每個被代理類都需要一個對應的代理類,代碼冗余度高,維護成本較大。

示例代碼:

// 接口
public interface Subject {void request();
}// 被代理類
public class RealSubject implements Subject {@Overridepublic void request() {System.out.println("RealSubject request");}
}// 代理類
public class StaticProxy implements Subject {private RealSubject realSubject;public StaticProxy(RealSubject realSubject) {this.realSubject = realSubject;}@Overridepublic void request() {System.out.println("Before request");realSubject.request();System.out.println("After request");}
}
動態代理

動態代理在運行時動態生成代理類,無需手動編寫代理類代碼。Java中可以通過java.lang.reflect.Proxy或第三方庫(如CGLIB)實現動態代理。

  • 實現方式:通過反射機制動態生成代理類,代理邏輯由InvocationHandler實現。
  • 優點:減少代碼冗余,一個代理類可以代理多個接口或類,靈活性高。
  • 缺點:性能略低于靜態代理,實現復雜度較高。

示例代碼(基于JDK動態代理):

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class DynamicProxyExample {public static void main(String[] args) {RealSubject realSubject = new RealSubject();Subject proxyInstance = (Subject) Proxy.newProxyInstance(realSubject.getClass().getClassLoader(),realSubject.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before request");Object result = method.invoke(realSubject, args);System.out.println("After request");return result;}});proxyInstance.request();}
}
主要區別
  • 生成時機:靜態代理在編譯時生成代理類;動態代理在運行時生成代理類。
  • 代碼量:靜態代理需要為每個被代理類編寫代理類;動態代理通過通用邏輯處理多個被代理類。
  • 靈活性:動態代理更靈活,適合代理多個類或接口;靜態代理適合簡單場景。
  • 性能:靜態代理直接調用方法,性能更高;動態代理涉及反射調用,性能略低。
適用場景
  • 靜態代理:代理邏輯簡單,被代理類數量較少。
  • 動態代理:需要代理多個類或接口,或代理邏輯需要動態變化。

通過比較可以看出,動態代理更適合復雜的業務場景,而靜態代理適合簡單且固定的需求。

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

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

相關文章

Linux系統編程Day9 -- gdb (linux)和lldb(macOS)調試工具

往期內容回顧 Git 教程(初階) 基于Linux系統知識的第一個程序 自動化構建工具-make/Makefile gcc/g編譯及鏈接 Vim工具的使用 Linux常用工具(yum與vim) 一、 Linux 下的調試工具 GDB 一、為什么要學習 GDB? 調試是開發…

數據結構(17)排序(下)

一、計數排序計數排序又稱為鴿巢原理,是對哈希直接定址法的變形應用。操作步驟如下:①統計相同元素出現的次數 ②根據統計的結果將序列回收到原來的序列中比如,現在有一個數組{6,1,2,9,4,2,4,1,4}。該數組中,元素1出現兩次&#…

深度解析 Spring Boot 循環依賴:原理、源碼與解決方案

在 Spring Boot 開發中,循環依賴是一個常見且容易被忽視的技術點。當兩個或多個 Bean 相互引用時,就會形成循環依賴(如 A 依賴 B,B 依賴 A)。初學者往往會困惑:Spring 為什么能自動處理這種看似矛盾的依賴關系?本文將從原理、源碼實現到解決方案,全方位剖析 Spring Boo…

數據庫的基本操作(約束與DQL查詢)

一、約束約束是在表上強制執行的數據規則,用于確保數據的完整性和一致性(1)約束類型MySQL中支持多種約束類型:①主鍵約束(PRIMARY KEY) ②自增約束(AUTO_INCREMENT)③非空約束…

HP Pavilion G6 筆記本安裝Ubuntu開機后自動進入飛行模式的問題解決

問題一臺HP Pavilion G6 筆記本 ,安裝了Ubuntu24.04版本,開機后,直接進入飛行模式,導致無法使用Wifi,且使用fnf10的組合鍵,也無法關閉飛行模式。使用fnf10鍵,可以看到提示顯示飛行模式,但無法關…

LLM:MoE原理與實現探索

文章目錄前言一、Deepseek Moe二. Moe架構1. Expert2. Gate3. MoE Module三、Auxiliary Loss總結前言 MoE(Mixture of Experts) 已經逐漸在LLM中廣泛應用,其工程部署相關目前也有了越來越多的支持,本文主要記錄一下MoE的基本模塊構造與原理。…

基于領域事件驅動的微服務架構設計與實踐

引言:為什么你的微服務總是"牽一發而動全身"? 在復雜的業務系統中,你是否遇到過這樣的困境:修改一個訂單服務,卻導致支付服務異常;調整庫存邏輯,用戶服務開始報錯。這種"蝴蝶效應…

如何使用curl編程來下載文件

libcurl 是一個功能強大的跨平臺網絡傳輸庫,支持多種協議。 本篇來介紹libcul的C語言編程,實現一個文件下載的功能。 1 curl基礎介紹 1.1 核心數據結構 1.1.1 CURL句柄 CURL是libcurl 的核心句柄,每個請求對應一個 CURL 實例,…

大語言模型提示工程與應用:ChatGPT提示工程技術指南

ChatGPT提示工程 學習目標 在本課程中,我們將學習更多關于ChatGPT的最新提示工程技術。 相關知識點 ChatGPT提示工程 學習內容 1 ChatGPT提示工程 ChatGPT是OpenAI研發的新型對話模型,具備多輪對話能力。該模型通過人類反饋強化學習(RLHF)訓練&am…

能力評估:如何系統評估你的技能和經驗

能力評估:如何系統評估你的技能和經驗 作為一名38歲的互聯網研發老兵,你已經積累了豐富的經驗,包括技術深度、項目管理、團隊協作等。但能力評估不是一次性事件,而是持續過程,幫助你識別優勢、短板,并為職業…

鴻蒙開發中所有自定義裝飾器的完整案例解析--涵蓋 16 個核心裝飾器的詳細用法和實戰場景

以下是鴻蒙開發中 所有自定義裝飾器的完整案例解析 和 終極總結指南,涵蓋 16 個核心裝飾器的詳細用法和實戰場景: 一、終極總結表:16大裝飾器全景圖 裝飾器類別V1V2核心作用典型場景Component組件定義??創建標準組件業務UI組件ComponentV2…

【C++】哈希表的實現(unordered_map和unordered_set的底層)

文章目錄 目錄 文章目錄 前言 一、unordered_set和unordered_map介紹 二、哈希表的介紹 三、哈希沖突的解決方法 1.開放定址法 2.鏈地址法 四、兩種哈希表代碼實現 總結 前言 前面我們學習了紅黑樹,紅黑樹就是map和set的底層,本篇文章帶來的是unordered…

歐拉公式的意義

歐拉公式的意義 歐拉公式(Euler’s Formula)是數學中最重要的公式之一,它將復數、指數函數和三角函數緊密聯系在一起。其基本形式為: eiθcos?θisin?θ e^{i\theta} \cos \theta i \sin \theta eiθcosθisinθ 當 θπ\thet…

Linux Docker 運行SQL Server

在Linux操作系統,已安裝docker,現在以docker compose方式,安裝一個最新版SQL Server 2022的數據庫。 # 建個目錄(請不要照抄,我的數據盤在/data,你可以改為/opt) mkdir /data/sqlserver# 進入目…

C++:stack_queue(2)實現底層

文章目錄一.容器適配器1. 本質:2. 接口:3. 迭代器:4. 功能:二.deque的簡單介紹1.概念與特性2.結構與底層邏輯2.1 雙端隊列(deque)結構:2.2 deque的內部結構2.3 deque的插入與刪除操作&#xff1…

Lightroom 安卓版 + Windows 版 + Mac 版全適配,編輯管理一站式,專業攝影后期教程

軟件是啥樣的? Adobe Lightroom 這軟件,在安卓手機、Windows 電腦和 Mac 電腦上都能用。不管是喜歡拍照的人,還是專門搞攝影的,用它都挺方便,能一站式搞定照片編輯、整理和分享這些事兒。 ****下載地址 分享文件:【Li…

office卸載不干凈?Office356卸載不干凈,office強力卸載軟件下載

微軟官方認可的卸載工具,支持徹底清除Office組件及注冊表殘留。需要以管理員身份運行,選擇“移除Office”功能并確認操作。 Office Tool Plus安裝地址獲取 點擊這里獲取:Office Tool Plus 1、雙擊打開軟件 image 2、選擇左右的工具箱&…

互聯網企業慢性死亡的招聘視角分析:從崗位割裂看戰略短視

內容簡介: 一個獵頭和HR的簡單拒絕,揭示了中國互聯網企業人才觀念的深層問題。通過分析崗位過度細分現象,本文探討了戰略短視、內斗文化和核心競爭力缺失如何導致企業慢性死亡,并提出了系統性的解決方案。#互聯網企業 #人才招聘 #…

OpenBMC中phosphor-dbus-interfaces深度解析:架構、原理與應用實踐

引言 在OpenBMC生態系統中,phosphor-dbus-interfaces作為D-Bus接口定義的核心組件,扮演著系統各模塊間通信"契約"的關鍵角色。本文將基于OpenBMC源碼,從架構設計、實現原理到實際應用三個維度,全面剖析這一基礎組件的技…

駕駛場景玩手機識別準確率↑32%:陌訊動態特征融合算法實戰解析

原創聲明本文為原創技術解析文章,核心技術參數與架構設計參考自《陌訊技術白皮書》,轉載請注明出處。一、行業痛點:駕駛場景行為識別的現實挑戰根據交通運輸部道路運輸司發布的《駕駛員不安全行為研究報告》顯示,駕駛過程中使用手…