反射(第三篇)、代理模式、靜態代理和動態代理、InvocationHandler實際應用

DAY11.3 Java核心基礎

反射(第三篇)

前兩篇我們學習了反射的概念和基本操作

實際開發中,反射應用于那里?

動態代理

java中的動態代理就是一個重要的作用

代理模式

代理模式是java中常用的設計模式

指的是在處理一個業務邏輯的時候通過代理的形式來完成,委托方委托代理方完成某些工作

委托方和代理方有一個共性:都具備完成業務的能力

代理分為委托方和代理方

委托方很好理解,代理方就把它想想為跑腿或者中介

image-20250314175759982

靜態代理和動態代理

  • 靜態代理:預先寫好代理類的方法,在編譯時期代理類的class文件就生成了
  • 動態代理:在編譯時期沒有確定具體的代理類,在程序運行期間根據java代碼的指示動態生成
  • 動態代理更加靈活,可以很方便了對代理類的方法進行統一的管理,不需要修改每一個代理類的方法
    動態代理是通過反射機制實現的,所以動態代理是反射重要的應用之一

如何在java程序中表現出來呢?

在java中,我們把對象所具備的能力封裝為接口,所以java中代理模式就是委托類和代理類實現了相同的接口,代理類可以替代委托類完成一些業務以外的工作

代理類和委托類通過依賴注入的方式進行關聯,需要將委托類注入到代理類的成員變量

訪問委托類是通過代理類間接訪問的,所以可以為程序預留出可以處理的空間,可以在不影響原來的業務上擴展功能,這就是代理模式的優點

靜態代理

靜態代理模式示例(銷售手機):

銷售 iPhone 和華為手機

1、定義一個接口 Phone 表示銷售手機的功能

2、定義兩個類分別實現銷售 iPhone 和華為的功能

創建一個手機的接口來抽象銷售手機的方法

public interface Phone {public void salePhone();
}

實體類銷售蘋果手機

public class Apple implements Phone{@Overridepublic void salePhone() {System.out.println("銷售蘋果手機");}
}

實體類銷售華為手機

public class Huawei implements Phone{@Overridepublic void salePhone() {System.out.println("銷售華為手機");}
}

如果我們要實現更好的銷售量以及更好的管理那么可以使用到代理類,就相當于把東西交給中介來賣,這個手機中介可以銷售多款手機

創建一個PhoneProxy代理類來銷售手機:

public class PhoneProxy implements Phone{private Phone phone;public PhoneProxy(Phone phone) {this.phone = phone;}@Overridepublic void salePhone() {System.out.println("代理類,在這可以完成業務以外的工作");phone.salePhone();}
}

測試代碼:

    public static void main(String[] args) {PhoneProxy proxy1 = new PhoneProxy(new Apple());proxy1.salePhone();PhoneProxy proxy2 = new PhoneProxy(new Huawei());proxy2.salePhone();}
}

image-20250314201730636

代理銷售汽車案例:

創建Car對象

public interface Car{public void saleCar();
}

銷售寶馬車

public class BWM implements Car{@Overridepublic void saleCar() {System.out.println("銷售寶馬");}
}

銷售奔馳車

public class Benz implements Car{@Overridepublic void saleCar() {System.out.println("銷售奔馳車");}
}

測試:

public static void main(String[] args) {CarProxy carProxy1 = new CarProxy(new BWM());CarProxy carProxy2 = new CarProxy(new Benz());carProxy1.saleCar();carProxy2.saleCar();
}

image-20250314210223924

可以實現銷售多款手機和汽車,可以在不影響委托類的業務基礎上擴展功能(比如統計買了幾臺手機…)

上述就是一個靜態代理,優勢在業務擴展的時候不需要修改委托類,只需要修改代理類的方法即可,在分離不同業務的同時保證代碼的整潔性

動態代理

現在的需求是創建一個廠商,既可以代理銷售手機又可以代理銷售汽車

怎么實現呢?

難道要注入兩個對象嗎,NoNoNo,這樣太不科學了

此時無法使用靜態代理,因為無論是 手機代理還是 汽車代理,都只能代理一種商品

靜態代理的問題就在于代理類已經寫好了,當需求變更的時候無法修改

類似這種問題,一個代理可以同時代理 N 種商品的模式,代理類就一定不能提前寫好,而是根據程序運行的具體情況動態生成的

代理對象,必須要創建,抽象類是無法創建對象的

代理類是不存在的,程序運行過程中動態創建一個類,從而創建該類對象,就叫做動態代理對象

動態代理的流程

1、只需要編寫委托類

2、不需要編寫代理類

3、程序運行過程中根據具體的需求動態創建一個代理類

4、根據動態創建出來的代理類來創建實例化對象

動態生成類的功能由誰來完成?

InvocationHandler 接口,通過該接口可以在程序運行期間動態生成代理類

根據委托對象創建動態代理對象

1、創建動態代理類

2、創建對象

代理類需要實現和委托類一樣的接口

根據委托類所實現的接口來創建代理類

類創建好之后需要加載到 JVM 中,由類加載器進行加載

public class MyInvocationHandler implements InvocationHandler {public Object obj;public Object bind(Object obj) {this.obj = obj;return Proxy.newProxyInstance(MyInvocationHandler.class.getClassLoader(),obj.getClass().getInterfaces(),this);}// 代理類代理的方法@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("這里是動態代理類,這里可以擴展方法");Object result = method.invoke(obj, args);return result;}
}
public static void main(String[] args) {MyInvocationHandler myInvocationHandler = new MyInvocationHandler();Car carProxy = (Car) myInvocationHandler.bind(new Benz());carProxy.saleCar();
}

輸出:

image-20250315105735720

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

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

相關文章

Unity 封裝一個依賴于MonoBehaviour的計時器(上) 基本功能

靈感來自下面這本書的協程部分,因此我就自己嘗試寫了一個 我的新書Unity3D游戲開發(第3版) | 雨松MOMO程序研究院 如果你不知道什么是協程:unity保姆級教程之協同程序_unity協同-CSDN博客 一句話概括:協程就是單線程的異步操作,其作用于Unity的主線程 1…

數學建模 第一節

目錄?????? 前言 一 優化模型的類型 二 線性規劃1 線性規劃2 三 0-1規劃 總結 前言 數學建模主要是將問題轉化為模型,然后再以編程的形式輸出出來 算法都知道,數學建模也需要用到算法,但是不是主要以編程形式展示,而是…

Vulkan視頻解碼decode顯示display之同步

在ReleaseDisplayedPicture函數中消耗圖片資源并且顯示display完成,設置兩個標志m_hasConsummerSignalFence true 和m_hasConsummerSignalSemaphore true virtual int32_t ReleaseDisplayedPicture(DecodedFrameRelease** pDecodedFramesRelease, uint32_t nu…

網絡空間安全(32)Kali MSF基本介紹

前言 Metasploit Framework(簡稱MSF)是一款功能強大的開源安全漏洞檢測工具,被廣泛應用于滲透測試中。它內置了數千個已知的軟件漏洞,并持續更新以應對新興的安全威脅。MSF不僅限于漏洞利用,還包括信息收集、漏洞探測和…

設計模式學習記錄

設計模式23種 創建型抽象工廠模式工廠模式生成器模式原型模式單例模式 結構型適配器模式橋接模式組合模式裝飾模式外觀模式享元模式代理模式 行為型責任鏈模式命令模式解釋器模式迭代器模式中介者模式備忘錄模式觀察者模式狀態模式策略模式模版方法模式訪問者模式 創建型 與對…

2.5 python接口編程

在現代軟件開發的復雜生態系統中,不同系統、模塊之間的交互協作至關重要。接口編程作為一種關鍵機制,定義了組件之間的通信規范與交互方式。Python 憑借其卓越的靈活性、豐富的庫資源以及簡潔易讀的語法,在接口編程領域占據了重要地位&#x…

mesh開發解析

開源的Mesh網絡協議棧及相關項目: 1.B.A.T.M.A.N.(Better Approach to Mobile Ad-hoc Networking)? 簡介:B.A.T.M.A.N.是一種用于多跳自組織網絡的路由協議,適用于無線Mesh網絡。它通過優化數據傳輸路徑,確保網絡的高可靠性和動…

PyTorch PINN實戰:用深度學習求解微分方程

在人工智能與計算數學的交匯點,物理信息神經網絡(Physics-Informed Neural Networks,PINN)正引領著一場求解微分方程的革命。傳統上,微分方程是描述自然現象和工程問題中各種關系的重要工具,但其求解往往依…

【WiFi 7核心技術及未來挑戰】

作為剛剛開始從事這一領域的人,淺淺學習了一下WiFi 7(IEEE 802.11be)。Wi-Fi 7發展迅速,提供前所未有的速度、更低的延遲和更高的可靠性。但從頻譜政策到能效挑戰,再到成本,仍有許多問題亟待解決。 Wi-Fi 7…

Oracle Linux Server 7.9安裝fail2ban

yum search oracle-epel-release yum install oracle-epel-release-el7 search fail2ban yum install fail2ban nano /etc/fail2ban/jail.d/00-firewalld.conf # defalut這里是設定全局設置,如果下面的監控沒有設置就以全局設置的值設置。 [DEFAULT] # 用于指定哪…

目標在哪里?——尋找人生的意義與方向

在職場中,許多人都會經歷這樣的困惑:工作看似順利,卻逐漸失去了成就感和成長感。一位在500強企業工作的學員就遇到了這樣的問題。她曾考慮過轉型做培訓,但苦于找不到明確的切入點,對未來的目標感到迷茫。她不禁問自己&…

C++類與對象——拷貝構造與運算符重載

拷貝構造函數和賦值運算符重載就是C類默認六個函數之二。 拷貝構造函數: 如果?個構造函數的第?個參數是自身類類型的引用,且任何額外的參數都有默認值,則此構造函數 也叫做拷貝構造函數,也就是說拷貝構造是?個特殊的構造函數…

破碎的誓言

破碎的誓言 在秋風的呢喃中,落葉輕嘆, 昔日的誓言,如煙消散。 你的眼眸,曾是我星辰的指引, 如今,卻成了最深的迷惘。 欺騙的利刃,刺穿了信任的堡壘, 我的心,如裂開…

AD畫板學習

AD畫板 01 課程簡介及學習目標 (1)能熟練的新建項目文件、原理圖文件、PCB文件且修改文件名,并知道文件保存的位置; (2)會設置原理圖編輯器的工作環境,會自底向上繪制層次原理圖; …

Linux:進程程序替換

目錄 前言 一 進程程序替換的概念 二 進程程序替換的原理 三 為什么需要進行進程程序替換 四 如何進行進程程序替換 1. 進程替換函數 ? execl()函數 ?execv()函數 ?execlp()函數 ?execle()函數 ?execve()* 前言 一般情況下,對應的語言寫的程序只…

基于變分推理與 Best?of?N 策略的元 Prompt 自動生成與優化框架

摘要 本文提出了一種融合變分推理與 Best?of?N 策略的元 Prompt 自動生成與優化框架,通過高度參數化的模板、隨機擾動采樣及多指標評分機制,實現從初始提示生成到最終輸出的動態優化。同時,針對實際應用中對自適應參數調整、深層語義理解、…

Umi-OCR 全家桶

介紹: 下載 訪問官網地址 https://github.com/hiroi-sora/umi-ocrhttps://github.com/hiroi-sora/umi-ocr 點擊下載(.exe 文件 安裝即可) 桌面使用 安裝完畢后去安裝路徑下點擊 Umi-OCR.exe (默認不會生成桌面的快捷方式&…

2023南京理工大學計算機復試上機真題

2023南京理工大學計算機復試上機真題 2023南京理工大學計算機復試機試真題 歷年南京理工大學計算機復試上機真題 在線評測:傳送門:pgcode.cn 括號匹配二 題目描述 苗苗今天剛剛學會使用括號,不過他分不清小括號,中括號&#…

Conda 常規用法指南

Conda 常規用法指南 1. Conda 簡介 Conda 是一個開源的包管理和環境管理系統,主要用于 Python 和其他編程語言的開發環境。它能夠方便地安裝、更新和管理依賴項,使得不同項目可以使用不同的 Python 版本和庫。 2. Conda 環境管理 2.1 創建新的環境 conda…

非零初始條件系統的傳遞函數分析

非零初始條件系統的傳遞函數分析 在傳遞函數的定義中,通常假設系統滿足零初始條件。然而在實際應用中,很多系統需要處理非零初始狀態。為了探討這一問題,我們以一個一階微分方程為例進行分析。 一、一階系統的分析 考慮以下一階微分方程&a…