解釋Java中的動態代理(Dynamic Proxy)及其用例

在Java中,動態代理(Dynamic Proxy)是一種在運行時動態創建代理類和對象的機制。它允許你在不改變原有類代碼的前提下,通過代理類對原有類的方法增加額外的處理邏輯(如安全檢查、事務處理、日志記錄等),從而增強或改變原有類的行為。

動態代理的工作原理

動態代理主要涉及到兩個核心類:InvocationHandlerProxy

  1. InvocationHandler —— 這是代理實例的調用處理程序實現的接口。代理實例的每個方法調用都會被轉發到該類的invoke方法。invoke方法可以實現你想要的任何代理邏輯。

  2. Proxy —— 這是用于創建動態代理類和實例的類。它有一個名為newProxyInstance的方法,該方法接收三個參數:一個類加載器(用來加載代理類)、一組接口(代理類需要實現的接口列表)和一個InvocationHandler(當代理實例的方法被調用時,方法調用會被轉發到這個調用處理程序)。newProxyInstance方法會返回一個實現了指定接口的代理實例。

動態代理的示例

假設我們有一個接口和一個實現了該接口的類:

public interface Service {void performAction();
}public class ServiceImpl implements Service {@Overridepublic void performAction() {System.out.println("Performing action in ServiceImpl");}
}

現在我們想在調用performAction前后打印日志,我們可以創建一個InvocationHandler來實現這個需求:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class LoggingHandler implements InvocationHandler {private final Object target; // 目標對象public LoggingHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before method " + method.getName());Object result = method.invoke(target, args); // 調用目標對象的方法System.out.println("After method " + method.getName());return result;}public static <T> T withLogging(T target, Class<T> iface) {return (T) Proxy.newProxyInstance(iface.getClassLoader(),new Class<?>[]{iface},new LoggingHandler(target));}public static void main(String[] args) {Service service = new ServiceImpl();Service proxy = withLogging(service, Service.class);proxy.performAction(); // 調用代理對象的方法}
}

當我們運行main方法時,會看到日志輸出在performAction的調用前后打印,這說明代理對象成功地在實際方法調用的前后增加了日志的額外邏輯。

動態代理的用例

  1. 日志記錄:在方法調用前后記錄日志,跟蹤方法的調用情況,常用于調試和監控目的。

  2. 事務處理:在執行數據庫操作前后發起提交或回滾,這是實現數據庫事務控制的一種常見方式。

  3. 權限檢查:在方法執行前檢查訪問權限,確保只有擁有正確權限的用戶才能調用方法。

  4. 性能監控:在方法執行前后記錄時間,監控方法執行所需時間。

  5. 延遲加載:當資源或組件的初始化開銷較大時,使用代理類做懶加載,只有在實際需要使用這些資源時才去創建它們。

  6. 網絡通信:動態代理可以方便地實現遠程方法調用(Remote Method Invocation,RMI)的客戶端代理,從而隱藏網絡通信的細節。

總結

動態代理是Java中一個強大的技術點,可以讓我們在運行時為一個或多個接口動態地創建代理實現。通過代理類的實現,我們能夠在方法調用鏈中插入自定義邏輯,而不必修改原始對象的代碼。

動態代理的靈活性開啟了很多高級編程技術的可能性,特別是在企業級應用和框架中,像Spring AOP(面向方面編程)就重度依賴動態代理。在Spring AOP中,動態代理被用來實現橫切關注點,比如聲明式事務管理、安全、日志等。

值得注意的是,動態代理僅能代理接口中的方法,如果要代理類中的方法,可以考慮使用CGLIB、ASM等字節碼操作庫,這些庫可以在運行時生成給定類的子類,并且在其中添加增強的代碼。

動態代理與CGLIB的比較

  • 動態代理:僅能代理實現了接口的類,使用Java反射API實現。
  • CGLIB:可以代理未實現接口的類,通過字節碼增強操。

CGLIB能做到動態代理無法實現的事情,即代理那些沒有實現接口的類。然而,它也有自己的局限性,比如不能代理final修飾的方法,因為這些方法不能被子類覆蓋。

動態代理性能注意事項

雖然動態代理提供了極高的靈活性,但它也帶來了一定的性能開銷。因為動態代理的實現依賴于反射API,而反射操作通常比直接的方法調用要慢。在性能要求較高的應用中,這種開銷可能成為一個問題。因此,在這類應用中需要謹慎權衡使用動態代理的利弊。

對于大部分企業應用,動態代理帶來的性能損失幾乎可以忽略不計,尤其是當它帶來的編程效率提升和系統架構上的靈活性被放在優先位置時。但是,如果遇到確實存在瓶頸的情況,可以考慮使用JVM提供的一些技術來改善,如即時編譯器(JIT)的優化、使用Proxy類的靜態代理版本或者直接使用底層字節碼增強方式。

總結來說,動態代理是一個非常強大的中間件,使得開發者可以以非常干凈和抽象的方式編寫應用邏輯,同時讓諸如日志記錄、事務管理這樣的輔助功能得以模塊化和重用。在設計模式中,它實現了代理模式,讓我們能夠在運行時為接口創建一個具體的代理實例,從而在不修改原始類代碼的前提下增加或改變類的行為。

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

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

相關文章

在為法人主體添加平衡段值時選不到相應的平衡段值

1、在為H1038公司添加平衡段值時&#xff0c;值集列表中無法選到需要的平衡段值&#xff0c;進一步對其后臺取值邏輯進行分析 SELECT *FROM (SELECT FLEXVALUES.FLEX_VALUE, FLEXVALUES.DESCRIPTIONFROM FND_FLEX_VALUES_VL FLEXVALUESWHERE FLEXVALUES.FLEX_VALUE_SET_ID :1…

Digimat在電池殼體SMC復合材料成型工藝中的應用

SMC工藝介紹及挑戰 SMC&#xff08;Sheet Molding Compound的縮寫&#xff0c;即片狀模塑料&#xff09;是一種復合材料制造工藝。該工藝可以有效地代替金屬&#xff0c;實現車輛輕量化目標。該工藝不僅能夠顯著降低車身重量&#xff0c;而且設計靈活&#xff0c;操作簡單、易…

社交媒體的探索者:探尋Facebook的發展歷程

在當今數字化時代&#xff0c;社交媒體已經成為了人們日常生活中不可或缺的一部分&#xff0c;而Facebook作為最具影響力的社交平臺之一&#xff0c;其發展歷程承載著無數的探索與創新。本文將深入探討Facebook的發展歷程&#xff0c;從其創立初期到如今的全球化影響&#xff0…

第 8 章 機器人底盤Arduino端電機驅動(自學二刷筆記)

重要參考&#xff1a; 課程鏈接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 講義鏈接:Introduction Autolabor-ROS機器人入門課程《ROS理論與實踐》零基礎教程 8.4.4 底盤實現_03Arduino端電機驅動 自定義電機驅動的實現與上一節的編碼器驅動流程類似&#xff1a; ROSA…

終于知道公司薪資為什么保密了!無意中拿到了部門薪資列表,自己身為小組長,只有28k,手下好幾個35k左右,心態崩了

大家好&#xff0c;我是瑤琴呀。 一直以來&#xff0c;員工不能私下談論薪資是職場公開的規定&#xff0c;入職的時候&#xff0c;HR 也會要求每個員工在保密薪資文件上簽字。 記得在大學上職業規劃課的時候&#xff0c;當時老師就給我們講過一個案例&#xff0c;公司里小李和…

數據結構與算法學習筆記九---循環隊列的表示和實現(C++)

目錄 前言 1.為什么要使用循環隊列 2.隊列的順序存儲方式的實現 1.定義 2.隊列初始化 3.銷毀 4.清空隊列 5.隊列是否為空 6.隊列長度 7.隊頭 8.入隊 9.出隊 10.遍歷隊列 11.完整代碼 3.參考資料 前言 這篇文章介紹循環隊列的表示和用法。 1.為什么要使用循環隊…

詳細分析Vue3中的defineExpose(附Demo)

目錄 前言1. 基本知識2. Demo3. 實戰 前言 其基本知識可參考官網&#xff1a;Vue3中的defineExpose 1. 基本知識 defineExpose 是 Vue 3 的 Composition API 中一個新的實用函數&#xff0c;用于在 <script setup> 語法下顯式暴露組件的公共屬性和方法 這在處理子組件…

OpenAI 重磅發布:ChatGPT Mac 桌面應用震撼上線!

OpenAI 重磅發布&#xff1a;ChatGPT Mac 桌面應用震撼上線&#xff01; 博主貓頭虎的技術世界 &#x1f31f; 歡迎來到貓頭虎的博客 — 探索技術的無限可能&#xff01; 專欄鏈接&#xff1a; &#x1f517; 精選專欄&#xff1a; 《面試題大全》 — 面試準備的寶典&#xff0…

51單片機:點亮一個LED燈

1.新建工程 選擇AT89C52&#xff0c;在Atmel下顯示的是See Microchip 并不需要添加啟動文件到文件夾中。 添加main.c文件&#xff0c;c比cpp效率高&#xff0c;.asm匯編即更底層 程序編寫好后 nop(); 該函數在這個頭文件里面 #include <INTRINS.H> #include <R…

Java JDK下載安裝教程(2024年)

博主介紹&#xff1a;?Java老徐、7年大廠程序員經歷。全網粉絲12w、csdn博客專家、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域和畢業項目實戰? &#x1f345;文末獲取源碼聯系&#x1f345; &#x1f447;&#x1f3fb; 精彩專欄推薦訂閱&#x1f447;&…

2024 Google I/O Android 相關內容匯總

2024 Google I/O Android 相關內容匯總 本次 Google I/O 的核心雖然是 AI &#xff0c;但是 Android 也是作為主要議題出現&#xff0c; Android 部分可以簡單分為產品和開發相關內容&#xff0c;接下來主要介紹這兩部分的相關更新。 重點開始開發相關&#xff0c;內容不少 產…

業務系統加固和安全設備加固

業務系統加固 業務系統包含哪些系統? 業務系統漏洞面臨的風險 1web風險 2漏洞掃描&#xff0c;端口掃描 3系統漏洞 4邏輯漏洞 5 信息泄露 6拒絕服務 7口令爆破 加固方式&#xff1a; 在風險加上修復 1web漏洞&#xff1a; 包括csrf,xss&#xff0c;口令破解等等 修…

koa2 + jsonwebtoken + koa-jwt:實現node token驗證

一、koa token生成、驗證 koa-jwt官網 https://github.com/koajs/jwt 推薦一個koa-jwt學習文檔&#xff1a; https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html jsonwebtoken方法添加 const { sign, verify } require(jsonwebtoken); const secretKey …

ICode國際青少年編程競賽- Python-4級訓練場-列表綜合練習

ICode國際青少年編程競賽- Python-4級訓練場-列表綜合練習 1、 Flyer[3].step(1) Flyer[7].step(2) Flyer[11].step(1) for i in range(4):Flyer[i * 2].step(1) Flyer[8].step(3)for i in range(3):Dev.turnRight()Dev.step(-5)2、 for i in range(5):Flyer[i5].step(Flyer[…

JavaWeb--18 tlias-web-management 登錄認證

登錄認證 1 登錄功能功能開發 2 登錄校驗2.1 問題分析2.2 會話技術CookieSession令牌技術 2.3 JWT令牌介紹生成和校驗登錄下發令牌 2.4 過濾器Filter攔截路徑過濾器鏈 登錄校驗-Filter 2.5 攔截器InterceptorInterceptor詳解執行流程 登錄校驗- Interceptor 3 異常處理3.1 當前…

【會議征稿】2024年機器人前沿技術與創新國際會議(FTIR 2024, 7/19-21)

2024年機器人前沿技術與創新國際會議&#xff08;FTIR 2024&#xff09;將于2024年7月19-21日在中國杭州舉行。FTIR 2024聚焦前沿技術與創新&#xff0c;將把機器人領域的創新學者和專家聚集到一個共同的論壇。會議的主要目標是促進機器人的研究和開發活動&#xff0c;另一個目…

基于EBAZ4205礦板的圖像處理:11閾值系數可調的圖像局部閾值二值化

基于EBAZ4205礦板的圖像處理&#xff1a;11閾值系數可調的圖像局部閾值二值化 先看效果 還是一樣拿我的pynq當模特&#xff0c;然后用usb——HDMI采集卡把輸出圖像采集到電腦上。 注意看右邊mobelxtem中的通過串口調節的參數&#xff0c; 我這里是實現了閾值系數可調的局部閾…

利用CAD繪制角度斜線的簡易指南---模大獅模型網

在CAD設計中&#xff0c;繪制角度斜線是常見的需求&#xff0c;尤其在工程、建筑等領域中。正確繪制角度斜線不僅可以提高圖紙的清晰度和美觀度&#xff0c;還有助于準確表達設計意圖。本文將介紹如何利用CAD軟件進行角度斜線的繪制&#xff0c;為您提供簡明易懂的操作指南。 一…

安全設備篇——抗DDOS設備

寫在前面&#xff1a;up初研究這個設備的時候以為很容易&#xff0c;畢竟ddos嘛大家都懂&#xff0c;但是實際去找資料和研究的時候發現資料少的可憐&#xff0c;再加上大家知道ddos但大多沒見過&#xff0c;萬幸up的老東家某普有這類設備&#xff0c;和之前的同事溝通了一下還…

實戰期權:權利金=定金;無需等到期日

買方: 無需支付保證金,只需支付較低的權利金(定金)。 風險: 虧損有上限,即權利金損失;但盈利無限,以小博大。 使用場景: 大型單邊行情。 行情的絕對頂部 or 底部,最好是第二次頂或者第二次抵,風險較小。 買方舉例: 假如判斷當前在底部,買入看漲期權call…