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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。

發布時間:2025/3/19 编程问答 18 豆豆

1. 代理模式有什么用

①功能增強,在實現目標功能的基礎上,又增加了額外功能。就像生活中的中介一樣,他跟兩邊客戶會有私下的交流。

②控制訪問,代理不讓用戶直接和目標接觸。就像中間商一樣,他們不會讓我們接觸廠家。

?

2. 靜態代理

特點:①代理類是手動實現的;②代理的目標類也是確定的。

2.1 首先定義一個Usb接口

2.2 其次創建兩個非public修飾的Usb接口實現類UsbKing和UsbSan(目標)

2.3 和Usb實現類進行聯系的TaoBao和Jingdong類(代理)

2.4 測試類(用戶)

2.5 總結

①優點:實現簡單、容易理解

②缺點:功能比較復雜時,代理類和目標類數量增多;目標類修改,會影響眾多的代理類,耦合度高,拓展性低

?

3. 動態代理

3.1 在實現動態代理前,我們先回顧一下反射的內容,通過反射直接訪問UsbKing(目標)

3.2 使用jdk的動態代理,動態地對目標類進行代理,主要有三步:①通過反射得到目標類對象;②重寫InvocationHandler的invoke方法(執行目標類對象的方法并進行功能增強);③創建動態代理對象并執行相應方法。測試類TestUsb代碼更改如下。

3.3 發生3.2的循環輸出情況,是因為handler里的invoke方法中?method.invoke(proxy, args) 執行的是代理對象的sell方法,那么會遞歸調用handler的invoke方法,從而一直循環。為了真正執行目標類的方法,那么需要將目標類對象傳給InvocationHandler,不使用匿名內部類,創建一個實現InvocationHandler接口的MyInvocationHandler類,結構和代碼如下。

3.4 雖然完成了動態代理,但博主這邊還要解釋一下newProxyInstance方法的三個參數:目標類對象的類加載器和接口,以及InvocationHandler對象。其中目標類對象的類加載器作為參數可以理解,因為這可以讓目標類對象和動態代理對象是同一個類加載器;然后InvocationHandler對象作為參數也可以理解,因為動態代理對象最終要調用handler中的invoke方法。然后目標類對象的接口作為參數是因為動態代理對象最終要能向上轉型為接口,上述代碼的?Usb o = (Usb) Proxy.newProxyInstance() 。所以最終這個代理對象實際是實現了Usb接口并重寫了sell方法。可通過反射查看如下。

3.5 動態代理的優點:①不用創建代理類、程序運行時動態創建;②目標類修改,不影響代理類,耦合度低,可拓展性高。

?

4. 動態代理的兩種模式——JDK動態代理和CGLIB動態代理

4.1 JDK動態代理:使用java.lang.reflect包下的InvocationHandler接口和Proxy和Method類實現動態代理功能。如果只是生成代理對象,可以不實現目標類的接口;但若要執行目標類的方法,那么必須要實現接口

4.2 CGLIB動態代理:第三方工具庫,通過繼承目標類重寫父類方法,所以類和方法不能被final修飾,實現功能修改。

?

?

總結

以上是生活随笔為你收集整理的什么是代理模式?代理模式有什么用?通过一个小程序分析静态代理和动态代理。自己简单实现动态代理。JDK动态代理和CGLIB动态代理的区别。的全部內容,希望文章能夠幫你解決所遇到的問題。

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