解析Java中的動態代理與靜態代理的區別

解析Java中的動態代理與靜態代理的區別

大家好,我是微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!

1. 引言

代理模式是軟件開發中常用的一種設計模式,用于控制對其它對象的訪問。在Java中,代理模式分為靜態代理和動態代理兩種實現方式。本文將深入分析和比較這兩種代理模式,以及它們在實際應用中的差異和適用場景。

2. 靜態代理

靜態代理是指在編譯期間就已經確定代理類的代理方式。它需要程序員手動編寫代理類或工具生成代理類的源代碼,然后編譯得到代理類的字節碼文件。以下是一個簡單的靜態代理示例:

package cn.juwatech.proxy;import cn.juwatech.*;interface Subject {void request();
}class RealSubject implements Subject {@Overridepublic void request() {System.out.println("RealSubject: Processing request.");}
}class ProxySubject implements Subject {private final RealSubject realSubject;public ProxySubject() {this.realSubject = new RealSubject();}@Overridepublic void request() {System.out.println("ProxySubject: Logging before request.");realSubject.request();System.out.println("ProxySubject: Logging after request.");}
}public class StaticProxyExample {public static void main(String[] args) {Subject proxy = new ProxySubject();proxy.request();}
}

在上述示例中,定義了一個Subject接口和其具體實現類RealSubject。ProxySubject作為靜態代理類,實現了Subject接口,并在方法調用前后添加了額外的日志功能。

3. 動態代理

動態代理是在運行時動態生成代理類的方式,無需手動編寫代理類的源代碼。Java中的動態代理機制主要依靠java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler接口。以下是一個簡單的動態代理示例:

package cn.juwatech.proxy;import cn.juwatech.*;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;interface Subject {void request();
}class RealSubject implements Subject {@Overridepublic void request() {System.out.println("RealSubject: Processing request.");}
}class DynamicProxyHandler implements InvocationHandler {private final Object target;public DynamicProxyHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("DynamicProxyHandler: Logging before request.");Object result = method.invoke(target, args);System.out.println("DynamicProxyHandler: Logging after request.");return result;}
}public class DynamicProxyExample {public static void main(String[] args) {RealSubject realSubject = new RealSubject();Subject proxy = (Subject) Proxy.newProxyInstance(Subject.class.getClassLoader(),new Class[] { Subject.class },new DynamicProxyHandler(realSubject));proxy.request();}
}

在這個示例中,DynamicProxyHandler實現了InvocationHandler接口,并在invoke方法中對方法調用進行增強。在運行時通過Proxy.newProxyInstance方法動態生成代理對象,并指定InvocationHandler來處理代理對象的方法調用。

4. 區別與適用場景

  • 靜態代理

    • 靜態代理在編譯時就已經確定代理類,不具備靈活性,每一個代理類只能為一個接口服務。
    • 適合于代理類較少、接口穩定的情況下使用,例如日志記錄、權限控制等靜態功能。
  • 動態代理

    • 動態代理通過反射在運行時生成代理對象,可以動態處理被代理類的方法調用,更加靈活和通用。
    • 適合于需要動態添加額外操作、處理多個類的統一邏輯的場景,如事務管理、RPC框架中的遠程方法調用等。

5. 結論

本文詳細分析了Java中靜態代理和動態代理的實現方式、區別以及適用場景。靜態代理適合于簡單的場景和固定的接口,而動態代理則更加靈活,適用于復雜的業務需求和動態的方法調用增強。

微賺淘客系統3.0小編出品,必屬精品,轉載請注明出處!

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

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

相關文章

C#中的Task.Delay(2000).Wait() 與await Task.Delay(2000)

Task.Delay(2000).Wait() 和 await Task.Delay(2000) 在功能上看似相似,都用于等待一段時間(在這個例子中是2000毫秒),但它們在使用方式和背后的行為上存在一些關鍵差異。 .Result 是 Task 類的一個屬性,它用于獲取任務…

算法刷題筆記 滑動窗口(C++實現,非常詳細)

文章目錄 題目描述基本思路實現代碼 題目描述 給定一個大小為n ≤ 10^6的數組。有一個大小為k的滑動窗口,它從數組的最左邊移動到最右邊。你只能在窗口中看到k個數字。每次滑動窗口向右移動一個位置。以下是一個例子: 該數組為 [1 3 -1 -3 5 3 6 7]&…

用HttpURLConnection復現http響應碼405

目錄 使用GET方法,訪問GET接口,服務端返回405使用GET方法,訪問POST接口,服務端返回405使用POST方法,訪問GET接口,服務端返回405 使用GET方法,訪問GET接口,服務端返回405 發生場景&a…

Linux shell編程學習筆記63:free命令 獲取內存使用信息

0 前言 在系統安全檢查中,內存使用情況也是一塊可以關注的內容。Linux提供了多個獲取內存信息的命令很多。今天我們先研究free命令。 1 free命令的功能、用法和選項說明 1.1 free命令的功能 free 命令可以顯示系統內存的使用情況,包括物理內存、交換…

Java多語言跨境電商外貿商城源碼 tiktok商城系統源碼 跨境電商源碼

Java多語言跨境電商外貿商城源碼 tiktok商城系統源碼 跨境電商源碼 技術棧 PC端使用:vueelementui 用戶端使用:uniapp 管理端使用:vueelementui 后臺服務使用:springbootmybatisplusmysql 功能描述: 對接PayPal…

【面試題】字節一面面試題

自我介紹,項目介紹MQ的使用場景,不同的MQ之前的區別,為什么使用公司的MQ數據庫怎么部署的(應該是問節點,庫表)事務隔離級別innodb為什么選可重復讀作為隔離級別數據庫三大日志,保存先后順序undo…

vue3+electron項目搭建,遇到的坑

我主要是寫后端,所以對前端的vue啊vue-cli只是知其然,不知其所以然 這樣也導致了我在開發前端時候遇到了很多的坑 第一個坑, vue2升級vue3始終升級不成功 第二個坑, vue add electron-builder一直卡進度,進度條走完就是不出提示succes 第一個坑的解決辦法: 按照網上說的升級v…

使用Java實現高性能的文件上傳下載服務

使用Java實現高性能的文件上傳下載服務 大家好,我是微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 1. 引言 在現代Web應用中,文件上傳和下載服務是非常常見的功能需求。如何實現高性能、可靠且安全…

Ubuntu 20.04下多版本CUDA的安裝與切換 超詳細教程

目錄 前言一、安裝 CUDA1.找到所需版本對應命令2.下載 .run 文件3.安裝 CUDA4.配置環境變量4.1 寫入環境變量4.2 軟連接 5.驗證安裝 二、安裝 cudnn1.下載 cudnn2.解壓文件3.替換文件4.驗證安裝 三、切換 CUDA 版本1.切換版本2.檢查版本 前言 當我們復現代碼時,總會…

深入分析SSL/TLS服務器的證書(C/C++代碼實現)

SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是網絡安全領域的重要協議,它們在保護網絡通信中發揮著至關重要的作用。這些協議通過加密和身份驗證機制,確保數據在傳輸過程中的機密性和完整性…

建投數據與中再數科簽署戰略合作協議

近日,建投數據科技股份有限公司(以下簡稱“建投數據”)與中再保數字科技有限責任公司(以下簡稱“中再數科”)簽署戰略合作協議。雙方通過資源整合共享,實現優勢互補,共同探索產品及服務的跨領域…

初見:AntDB智能運維“三劍客“之ACC

前情回顧 在前兩個章節中,我們介紹了 AntDB 智能運維"三劍客"的 ADC 和 MTK。 初見:AntDB智能運維"三劍客"之ADC 初見:AntDB智能運維"三劍客"之MTK 本文將繼續介紹 AntDB 數據庫智能運維平臺 ACC。 AntDB 介紹…

如何設置PHP wkhtmltopdf

首先參考:Composer三步曲:安裝、使用、發布 在 php 路徑下,應能打開命令行輸入php -v能夠看到php版本信息。 然后執行以下三條: php -r "copy(https://install.phpcomposer.com/installer, composer-setup.php);"php…

minist數據集分類模型的訓練

minist數據集訓練 訓練方法:利用pytorch來實現minist數據集的分類模型訓練 訓練模型如下圖所示 模型代碼: import torch from torch import nn from torch.nn import Flattenclass Net(nn.Module):def __init__(self):super().__init__()self.module …

ChatGPT對話:Scratch編程中一個單詞,如balloon,每個字母行為一致,如何優化編程

【編者按】balloon 7個字母具有相同的行為,根據ChatGPT提供的方法,優化了代碼,方便代碼維護與復用。初學者可以使用7個字母精靈,復制代碼到不同精靈,也能完成這個功能,但不是優化方法,也沒有提高…

__builtin_constant_p 常量檢查函數

__builtin_constant_p 詳細介紹 功能:__builtin_constant_p 是 GCC (GNU Compiler Collection) 提供的一個內置函數,用于在編譯時檢測一個表達式是否是常量。它返回一個整型值: 如果表達式 exp 是編譯時常量,則返回 1。否則&…

【sklearn模型訓練全指南】深入理解機器學習模型的構建過程

標題:【sklearn模型訓練全指南】深入理解機器學習模型的構建過程 在機器學習中,模型訓練是一個核心過程,它涉及到從數據中學習并獲得預測能力。scikit-learn(簡稱sklearn)作為Python中一個廣泛使用的機器學習庫&#…

FairJob:促進在線廣告系統公平性研究

在人工智能(AI)與人類動態的交匯處,既存在機遇也存在挑戰,特別是在人工智能領域。盡管取得了進步,但根植于歷史不平等中的持續偏見仍然滲透在我們的數據驅動系統中,這些偏見不僅延續了不公平現象&#xff0…

Centos新手問題——yum無法下載軟件

起因:最近在學習centos7,在VM上成功安裝后,用Secure進行遠程登陸。然后準備下載一個C編譯器,看網絡上的教程,都是用yum來下載,于是我也輸入了命令: yum -y install gcc* 本以為會自動下載&…

使用Python繪制雷達圖

使用Python繪制雷達圖 雷達圖效果代碼 雷達圖 雷達圖,也稱為蛛網圖或星型圖,是一種二維圖表,用于顯示多變量數據。每個變量在一個從中心點向外輻射的軸上表示,軸的數量與變量的數量相同。雷達圖通常用于比較多個樣本的多維數據&a…