java動態代理的使用和代碼示例

文章目錄

  • 1. 簡介
  • 2. 代碼
  • 3. 參考鏈接

1. 簡介

代理類在程序運行時創建的代理方式被成為動態代理。在靜態代理中,代理類(RenterProxy)是自己已經定義好了的,在程序運行之前就已經編譯完成。而動態代理是在運行時根據我們在Java代碼中的“指示”動態生成的。動態代理相較于靜態代理的優勢在于可以很方便的對代理類的所有函數進行統一管理,如果我們想在每個代理方法前都加一個方法,如果代理方法很多,我們需要在每個代理方法都要寫一遍,很麻煩。而動態代理則不需要。

spring 中aop便是基于代理進行的

2. 代碼

需要代理的用戶
一個大明星

public class BigStar implements Star{private String name;public BigStar(String name){this.name = name;}public String sing(String name){System.out.println(this.name + "在唱" + name);return "謝謝!!!";}public void dance(){System.out.println(this.name + "跳舞!!!");}
}

遵守規則,寫個接口

public interface Star {String sing(String name);void dance();
}

我是代理工廠

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;public class ProxyUtil {public static Star createProxy(BigStar bigStar){/**     public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)*/Star starProxy = (Star)Proxy.newProxyInstance(ProxyUtil.class.getClassLoader(), new Class[]{Star.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if(method.getName().equals("sing")){System.out.println("準備話筒,收錢");}else if(method.getName().equals("dance")){System.out.println("場地準備中。。。收錢。。。");}return method.invoke(bigStar, args);}});return starProxy;}
}

測試類

public class Test {public static void main(String[] args) {BigStar bigStar = new BigStar("岳軒子");Star starProxy = ProxyUtil.createProxy(bigStar);String rs = starProxy.sing("恭喜發財");System.out.println(rs);starProxy.dance();}
}

運行結果:

準備話筒,收錢
岳軒子在唱恭喜發財
謝謝!!!
場地準備中。。。收錢。。。
岳軒子跳舞!!!

3. 參考鏈接

java動態代理
【黑馬磊哥】Java動態代理深入剖析,真正搞懂Java核心設計模式:代理設計模式

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

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

相關文章

前端vue 實現取色板 的選擇

大概就是這樣的 一般的web端框架 都有自帶的 的 比如 ant-design t-design 等 前端框架 都是帶有這個的 如果遇到沒有的我們可以自己嘗試開發一下 簡單 的 肯定比不上人家的 但是能用 能看 說的過去 我直接上代碼了 其實這個取色板 就是一個input type 是color 的input …

CTF學習記錄(一)——Web基礎

目錄 Web基礎Web基礎常用工具ncat(網絡工具中的瑞士軍刀&#xff0c;功能齊全)curl(一個工作在命令行的發起HTTP請求的工具)BurpSuite(Web核心抓包工具)Hackbar插件SwitchyOmega 代理插件&#xff08;非常牛逼&#xff09;Wappalyzer 技術判斷插件EditThisCookie 插件Postman 接…

深入理解Spring Boot中的定時任務調度

深入理解Spring Boot中的定時任務調度 大家好&#xff0c;我是微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. Spring Boot中的定時任務概述 在現代應用程序開發中&#xff0c;定時任務調度是一項非常常見和重要的功能…

【計算機網絡03】不花錢怎么搭建一個網絡實驗室

使用GNS3和虛擬機搭建網絡實驗室 1、安裝抓包工具分析數據包2、定義和使用抓包篩選器3、安裝和配置GNS34、配置路由器和VPCS5、使用WireShark捕獲GNS3網絡數據包6、VMware創建虛擬機7、使用思科PacketTracer 1、安裝抓包工具分析數據包 官網安裝wireshark&#xff1a;https://…

python怎么判斷字符串以什么結尾

在python編輯器中新建一個data.py。 寫上自己的注釋。 然后新建一個變量testname。 利用endswith來判斷字符串是不是以“ar”結尾。 將結果打印出來。 選擇“run”->“run”。 運行該程序&#xff0c;如果是&#xff0c;就會返回true。

JavaScript-日期對象

日期對象 作用&#xff1a;用來表示時間的對象 獲取當前時間 const datenew Date();console.log(date);可以得到日期對象&#xff0c;里面的屬性有星期&#xff0c;年月日&#xff0c;時分秒 獲取指定時間 const datenew Date(2023-05-01);console.log(date); 獲取時間戳 時間…

PyTorch深度學習實戰(45)——強化學習

PyTorch深度學習實戰&#xff08;45&#xff09;——強化學習 0. 前言1. 強化學習基礎1.1 基本概念1.2 馬爾科夫決策過程1.3 目標函數1.4 智能體學習過程 2. 計算狀態值3. 計算狀態-動作值4. Q 學習4.1 Q 值4.2 Gym環境4.3 構建 Q 表4.4 探索-利用策略 小結系列鏈接 0. 前言 強…

悠律凝聲環開放式耳機體驗:強勁低音、高顏值設計

最近發現了一款潮酷的開放式耳機&#xff0c;不僅顏值抗打&#xff0c;更重要的是能在嘈雜的環境中提供給我一份寧靜的沉浸式音樂體驗&#xff0c;號稱是開放音頻中的重低音之王&#xff0c;它就是悠律凝聲環開放式耳機。 這款耳機無論其外觀設計、音質效果、性價比以及續航能力…

通勤數據:Comma2k19 數據集

A Commute in Data: The comma2k19 Dataset 通勤數據&#xff1a;Comma2k19 數據集 https://arxiv.org/pdf/1812.05752v1 Abstract— comma.ai presents comma2k19, a dataset of over 33 hours of commute in California’s 280 highway. This means 2019 segments, 1 minut…

js實現尋找數組中滿足某個條件的對象,以及找到下標后,在數組中插入某個對象

let ItemIndex fileList.findIndex((item) > { return item.xxx 你要找的屬性值 }); if(ItemIndex > -1){ // 代表找到了這個元素 } else { } 參考百度AI: 在JavaScript中&#xff0c;?可以使用splice()方法在指定位置插入一個或多個對象到數組…

npm、cnpm、pnpm、yarn的區別

npm, cnpm, pnpm, 和 yarn 都是 JavaScript 的包管理工具&#xff0c;用于自動化處理包的安裝、更新、配置和管理。它們之間的主要區別在于它們各自的實現方式、性能優化、以及一些特有的功能。 npm npm (Node Package Manager) 是 Node.js 的默認包管理器&#xff0c;也是最…

「媒體邀約」上海請媒體的費用

傳媒如春雨&#xff0c;潤物細無聲&#xff0c;大家好&#xff0c;我是51媒體網胡老師。 上海無疑是最具活動的城市之一&#xff0c;各種大大小小的論壇、發布會、展覽展會應接不暇&#xff0c;那么在上海做活動想邀請媒體進行宣傳報道&#xff0c;需要多少費用呢&#xff1a;…

Android --- 運行時Fragment如何獲取Activity中的數據,又如何將數據傳遞到Activity中呢?

1.通過 getActivity() 方法獲取 Activity 實例&#xff1a; 在 Fragment 中&#xff0c;可以通過 getActivity() 方法獲取當前 Fragment 所依附的 Activity 實例。然后可以調用 Activity 的公共方法或者直接訪問 Activity 的字段來獲取數據。 // 在 Fragment 中獲取 Activity…

手慢無,速看︱PMO大會內部學習資料

全國PMO專業人士年度盛會 每屆PMO大會&#xff0c;組委會都把所有演講嘉賓的PPT印刷在了會刊里面&#xff0c;供大家會后回顧與深入學習。 第十三屆中國PMO大會-會刊 《2024第十三屆中國PMO大會-會刊》 &#xff08;內含演講PPT&#xff09; 會刊&#xff1a;750個頁碼&…

代碼隨想錄-DAY④-鏈表——leetcode 24 | 19 | 142

24 思路 如果 pre 的后面沒有節點或者只有一個節點&#xff0c;則沒有更多的節點需要交換, 否則&#xff0c;通過更新節點的指針關系交換 pre 后面的兩個節點&#xff0c; 最后&#xff0c;返回新的鏈表的頭節點 dummyhead->next。 時間復雜度&#xff1a;O(n) 空間復雜…

buuctf面具下的flag

細節: 這道題可能因為是vmdk的原因 導致在window上 7z無法得到全部的信息 所以最后解壓要在linux系統上 解密網站 Brainfuck/Ook! Obfuscation/Encoding [splitbrain.org] 這道題010打開,可以發現里面隱藏了很多 binwalk解壓 兩個文件 vmdk可以直接 用7z解壓 7z x flag.…

Mysql如何高效ALTER TABL

ALTER TABLE 缺點 MySQL 的ALTER TABLE 操作的性能對大表來說是個大問題。 MySQL MySQL 執行大部分修改表結構操作的方法是用新結構的 創建一個&#xff0c;空表從舊表中查出所有數據插入&#xff0c;新表然后刪除舊。表這樣操作可能需要花費很長&#xff0c;時間 如內果存不…

Flutter TabBar與TabBarView聯動及獲取當前點擊欄目索引

TabBar還有TabBarView都是谷歌flutter官方組件庫——Material組件庫提供的組件&#xff0c;其中TabBar用于導航切換&#xff0c;TabBarView則是配合其切換顯示的對應的視圖&#xff0c;官網參考地址&#xff1a;TabBarView class - material library - Dart API。 實現一體聯動…

輕松搭建RAG:澳鵬RAG開發工具

我們很高興地宣布推出RAG開發工具&#xff0c;這是澳鵬大模型智能開發平臺的一項新功能。此功能可幫助團隊輕松創建高質量的檢索增強生成 (RAG) 模型。 什么是 RAG&#xff1f; 檢索增強生成 (RAG) 通過利用大量外部數據源&#xff08;例如企業的知識庫&#xff09;顯著增強了…

文獻閱讀(1)——深度強化學習求解車輛路徑問題的研究綜述

doi&#xff1a; 10.3778/j.issn.1002-8331.2210-0153 深度強化學習求解車輛路徑問題的研究綜述 (ceaj.org) 組合最優化問題&#xff08; combinatorial optimization problem&#xff0c; COP &#xff09; 日常生活中常見的 COP 問題有旅行商問題&#xff08;traveling sale…