動態代理總結

Java 代理模式

使用代理對象來代替對真實對象(real object)的訪問,這樣就可以在不修改原目標對象的前提下,提供額外的功能操作,擴展目標對象的功能



靜態代理

靜態代理在編譯時就將接口、實現類、代理類這些都變成了一個個實際的 class 文件

public interface SmsService {public void send(String message);
}class SmsServiceImpl implements SmsService{@Overridepublic void send(String message) {System.out.println("message :"+message);}
}class SmsServiceProxy implements SmsService{private SmsService smsService;public SmsServiceProxy(SmsService smsService){this.smsService = smsService;}@Overridepublic void send(String message) {System.out.println("輸出消息前");smsService.send(message);System.out.println("輸出消息后");}public static void main(String[] args) {SmsServiceImpl smsService = new SmsServiceImpl();SmsServiceProxy smsServiceProxy = new SmsServiceProxy(smsService);smsServiceProxy.send("這是個消息");/*      輸出消息前message :這是個消息 輸出消息后*/}
}




動態代理

從 JVM 角度來說,動態代理是在運行時動態生成類字節碼,并加載到 JVM 中的


JDK 動態代理機制

在 Java 動態代理機制中 InvocationHandler 接口和 Proxy 類是核心

    public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throws IllegalArgumentException{......}
  1. loader :類加載器,用于加載代理對象。
  2. interfaces : 被代理類實現的一些接口;
  3. h : 實現了 InvocationHandler 接口的對象;
public interface InvocationHandler {/*** 當你使用代理對象調用方法的時候實際會調用到這個方法*/public Object invoke(Object proxy, Method method, Object[] args)throws Throwable;
}
  1. proxy :動態生成的代理類
  2. method : 與代理類對象調用的方法相對應
  3. args : 當前 method 方法的參數

通過Proxy 類的 newProxyInstance() 創建的代理對象在調用方法的時候,實際會調用到實現InvocationHandler 接口的類的 invoke()方法。

你可以在 invoke() 方法中自定義處理邏輯,比如在方法執行前后做什么事情



CGLIB 動態代理機制

JDK 動態代理有一個最致命的問題是其只能代理實現了接口的類,為了解決這個問題 CGLIB 動態代理機制來避免

在 CGLIB 動態代理機制中 MethodInterceptor 接口和 Enhancer 類是核心

public interface MethodInterceptor
extends Callback{// 攔截被代理類中的方法public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args,MethodProxy proxy) throws Throwable;
}
  1. obj : 被代理的對象(需要增強的對象)
  2. method : 被攔截的方法(需要增強的方法)
  3. args : 方法入參
  4. proxy : 用于調用原始方法

通過 Enhancer類來動態獲取被代理類,當代理類調用方法的時候,實際調用的是 MethodInterceptor 中的 intercept 方法





JDK 動態代理和 CGLIB 動態代理對比

  1. JDK 動態代理只能代理實現了接口的類或者直接代理接口,而 CGLIB 可以代理未實現任何接口的類。 另外, CGLIB 動態代理是通過生成一個被代理類的子類來攔截被代理類的方法調用,因此不能代理聲明為 final 類型的類和方法。
  2. 就二者的效率來說,大部分情況都是 JDK 動態代理更優秀,隨著 JDK 版本的升級,這個優勢更加明顯。





靜態代理和動態代理的對比

  1. 靈活性
  2. JVM 層面

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

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

相關文章

MQ如何防止消息被重復消費?

被詢問如何防止MQ消息被重復消費時&#xff0c;其實是在考察候選人對消息隊列、分布式系統設計以及容錯機制的理解&#xff0c;通過這些問題&#xff0c;可以全面了解候選人在處理MQ消息重復消費問題時的思考方式、技術能力和實踐經驗&#xff0c;從而評估其是否適合擔任相關崗…

Puzzles

題目鏈接&#xff1a;Submit - Codeforces?????? 解題思路&#xff1a; 題目大概意思就是在一個數組里找n個數里的最大值減最小值的最小值&#xff0c;先排序&#xff0c;然后將第i n - 1項減去第i項與最小值作比較&#xff0c;輸出最小值即可&#xff0c;注意循環結束…

NTP網絡校時服務器(GPS北斗衛星校時系統)應用場景

NTP網絡校時服務器&#xff08;GPS北斗衛星校時系統&#xff09;應用場景 NTP網絡校時服務器&#xff08;GPS北斗衛星校時系統&#xff09;應用場景 隨著大數據、云計算時代的到來,各行業信息化建設的不斷提升,信息化下的各個系統不再單獨處理各自業務,而是趨于協同工作,因此,各…

YOLOv應用開發與實現

一、背景與簡介 YOLO&#xff08;You Only Look Once&#xff09;是一種流行的實時目標檢測系統&#xff0c;其核心思想是將目標檢測視為回歸問題&#xff0c;從而可以在單個網絡中進行端到端的訓練。YOLOv作為該系列的最新版本&#xff0c;帶來了更高的檢測精度和更快的處理速…

代碼隨想錄day34||● 860.檸檬水找零 ● 406.根據身高重建隊列 ● 452. 用最少數量的箭引爆氣球

860. 檸檬水找零 - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool lemonadeChange(vector<int>& bills) {int five0,ten0,twenty0;for(int bill:bills){if(bill5)five;if(bill10){if(five<0)return false;ten;five--;}if(bill20){if(ten&g…

【框架】MyBatis 框架重點解析

MyBatis 框架重點解析 1. MyBatis 執行流程 會話工廠生產的 SqlSession 對象提供了對數據庫執行SQL命令所需的所有方法&#xff0c;包括但不限于以下功能&#xff1a; 數據庫操作&#xff1a;SqlSession可以執行查詢&#xff08;select&#xff09;、插入&#xff08;insert&a…

騰訊云幻獸帕魯游戲存檔遷移教程,本地單人房遷移/四人世界怎么遷移存檔?

騰訊云幻獸帕魯游戲存檔遷移的方法主要包括以下幾個步驟&#xff1a; 登錄輕量云控制臺&#xff1a;首先&#xff0c;需要登錄到輕量云控制臺&#xff0c;這是進行存檔遷移的前提條件。在輕量云控制臺中&#xff0c;可以找到接收存檔的服務器卡片&#xff0c;并點擊進入實例詳情…

Jmeter 安裝

JMeter是Java的框架&#xff0c;因此在安裝Jmeter前需要先安裝JDK&#xff0c;此處安裝以Windows版為例 1. 安裝jdk&#xff1a;Java Downloads | Oracle 安裝完成后設置環境變量 將環境變量JAVA_HOME設置為 C:\Program Files\Java\jdk1.7.0_25 在系統變量Path中添加 C:\Pro…

股票技術指標(包含貪婪指數)

股票技術指標是用于分析股票價格和成交量數據&#xff0c;以便預測未來市場走勢的工具。技術分析師使用這些指標來識別市場趨勢、價格模式、交易信號和投資機會。技術指標通常基于數學公式&#xff0c;并通常在股票價格圖表上以圖形形式表示。 技術指標主要分為以下幾類&#x…

A Brief Introduction of the Tqdm Module in Python

DateAuthorVersionNote2024.02.28Dog TaoV1.0Release the note. 文章目錄 A Brief Introduction of the Tqdm Module in PythonIntroductionKey FeaturesInstallation Usage ExamplesBasic UsageAdvanced Usage A Brief Introduction of the Tqdm Module in Python Introducti…

力扣hot100:42.接雨水

什么時候能用雙指針&#xff1f; &#xff08;1&#xff09;對撞指針&#xff1a; ①兩數和問題中可以使用雙指針&#xff0c;先將兩數和升序排序&#xff0c;可以發現規律&#xff0c;如果當前兩數和大于target&#xff0c;則右指針向左走。 ②接雨水問題中&#xff0c;左邊最…

【算法集訓】基礎算法:枚舉

一、基本理解 枚舉的概念就是把滿足題目條件的所有情況都列舉出來&#xff0c;然后一一判定&#xff0c;找到最優解的過程。 枚舉雖然看起來麻煩&#xff0c;但是有時效率上比排序高&#xff0c;也是一個不錯的方法、 二、最值問題 1、兩個數的最值問題 兩個數的最小值&…

Vscode安裝,ssh插件與配置

原因 發現很多新人在練習linux&#xff0c;可是只有windows機的時候&#xff0c;一般都是下載虛擬機&#xff0c;然后在虛擬機上安裝ubuntu等linux平臺。每次需要在linux中寫代碼&#xff0c;就打開ubuntu&#xff0c;然后在終端上用vim寫代碼&#xff0c;或者先編輯代碼文本&…

css實現上下左右居中

css實現子盒子在父級盒子中上下左右居中 幾種常用的上下左右居中方式 HTML代碼部分 <div class"box"><img src"./img/77.jpeg" alt"" class"img"> </div>css部分 方式一 利用子絕父相和margin:auto實現 <sty…

內存管理 -----分段分頁

分段 分段&#xff1a;程序的分段地址空間&#xff0c;分段尋址方案 兩個問題 分段 &#xff1a;是更好分離和共享 左邊是有序的邏輯地址&#xff0c;右邊是無序的物理地址&#xff0c;然后需要有一種映射的關系&#xff08;段關聯機制&#xff09; 各個程序的分配相應的地址…

Gin入門指南:從零開始快速掌握Go Web框架Gin

官網:https://gin-gonic.com/ GitHub:https://github.com/gin-gonic 了解 Gin Gin 是一個使用 Go 語言開發的 Web 框架,它非常輕量級且具有高性能。Gin 提供了快速構建 Web 應用程序所需的基本功能和豐富的中間件支持。 以下是 Gin 框架的一些特點和功能: 快速而高效:…

【簡說八股】面試官:你知道什么是IOC么?

回答 Spring的IOC&#xff08;Inversion of Control&#xff0c;控制反轉&#xff09;是Spring框架的核心特性之一。它通過將對象的創建和依賴關系的管理交給Spring容器來實現&#xff0c;降低了組件之間的耦合性&#xff0c;使得代碼更加靈活、可維護。 在傳統的開發模式中&…

Sora模型風口,普通人如何抓住-最新AI系統ChatGPT網站源碼,AI繪畫系統

一、前言說明 PandaAi創作系統是基于ChatGPT進行開發的Ai智能問答系統和Midjourney繪畫系統&#xff0c;支持OpenAI-GPT全模型國內AI全模型。本期針對源碼系統整體測試下來非常完美&#xff0c;那么如何搭建部署AI創作ChatGPT&#xff1f;小編這里寫一個詳細圖文教程吧。已支持…

邊緣計算與任務卸載基礎知識

目錄 邊緣計算簡介任務卸載簡介參考文獻 邊緣計算簡介 邊緣計算是指利用靠近數據生成的網絡邊緣側的設備&#xff08;如移動設備、基站、邊緣服務器、邊緣云等&#xff09;的計算能力和存儲能力&#xff0c;使得數據和任務能夠就近得到處理和執行。 一個典型的邊緣計算系統為…

前端按鈕動畫

效果示例 代碼示例 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevic…