日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一分钟看懂动态代理

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一分钟看懂动态代理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

動態代理:

在不改變目標對象方法的情況下對方法進行增強

組成部分:

  • 被代理對象:真實的對象
  • 代理對象:內存中的一個對象

要求:

代理對象必須和被代理對象實現相同的接口

實現

使用Proxy.newProxyInstance()

舉栗子:

1.現實生活代理

賣票接口:抽象對象,規定要有賣票的方法
你買火車票 -> 黃牛 -> 12306
你買電腦 -> 電腦的代理商 -> 電腦廠家

2.代理模式三要素

1.真實對象: 12306
2.代理對象: 黃牛
3.抽象對象: 賣票的接口

3.什么是動態代理

在程序運行的過程中創建代理對象

4.代理模式好處

1.對方法進行增強
2.可以攔截方法

5.動態代理的API

Proxy類:

  • static Object newProxyInstance?(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)創建代理對象
  • 返回值Object: 創建出代理對象
    • ClassLoader loader: 類加載器
    • Class<?>[] interfaces: 接口數組, 新建的代理對象會實現指定的接口
    • InvocationHandler h: 執行處理器, 當代理對象調用方法時,就會執行InvocationHandler的invoke方法

演示:

要求在不改變Student類的前提下,將趴著學習改成站著學習
學生類:

public class Student implements StudentInterface {@Overridepublic void eat(String name) {System.out.println("學生吃" + name);}@Overridepublic void study() {System.out.println("趴著學習");} }

接口類:

public interface StudentInterface {void eat(String name);void study(); }

測試類:

public class Test {public static void main(String[] args) {Student student = new Student();// 需求:在不改變Student類代碼前提下,通過study方法輸出,站著學習/*參數一:類加載器:和被代理對象使用相同的類加載器參數二:接口類型Class數組:和被代理對象使用相同接口參數三:完成代理增強的功能*/StudentInterface sp = (StudentInterface) Proxy.newProxyInstance(student.getClass().getClassLoader(), new Class[]{StudentInterface.class}, new InvocationHandler() {// 執行Student類中所有方法都會經過invoke方法,對method方法判斷,是想要的方法就可以處理@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (method.getName().equals("study")) {System.out.println("站著學習");return null;} else {return method.invoke(student, args);}}});sp.eat("包子");sp.study();} }

總結

以上是生活随笔為你收集整理的一分钟看懂动态代理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。