JDK和CGLib動態(tài)代理怎么實現(xiàn)

本篇內(nèi)容介紹了“JDK和CGLib動態(tài)代理怎么實現(xiàn)”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

溫江ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為創(chuàng)新互聯(lián)建站的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!

前言:動態(tài)代理是一種常用的設(shè)計模式,廣泛應(yīng)用于框架中,Spring框架的AOP特性就是應(yīng)用動態(tài)代理實現(xiàn)的,想要理解AOP的實現(xiàn)原理我們就必須先理解動態(tài)代理。

什么是代理模式

代理模式是GOF23設(shè)計模式之一,代理模式中存在代理者和被代理者,代理者和被代理者都具有相同的功能,并且代理者執(zhí)行功能時會附加一些額外的操作

如:手機(jī)工廠和代理商都具有賣東西的功能,手機(jī)代理商除了幫工廠賣手機(jī)外,還能在賣手機(jī)前打廣告推銷,賣手機(jī)后還可以進(jìn)行售后服務(wù)。

JDK和CGLib動態(tài)代理怎么實現(xiàn)

代理模式的優(yōu)點:

1)符合開閉原則,不用修改被代理者任何的代碼,就能擴(kuò)展新的功能

2)項目的擴(kuò)展和維護(hù)比較方便

代理模式分為:靜態(tài)代理和動態(tài)代理

靜態(tài)代理

什么是靜態(tài)代理

1)代理者和被代理者都實現(xiàn)了相同的接口(或繼承相同的父類)

2)代理者包含了一個被代理者的對象

3)調(diào)用功能時,代理者會調(diào)用被代理者的功能,同時附加新的操作

  1. /**

  2. * 賣手機(jī)

  3. */

  4. public interface SellMobilePhone {

  5. void sellMobilePhone();

  6. }

  7. /**

  8. * 小米手機(jī)工廠

  9. */

  10. public class MiPhoneFactory implements SellMobilePhone{

  11. public void sellMobilePhone() {

  12. System.out.println("生產(chǎn)了小米9手機(jī),賣出去??!");

  13. }

  14. }

  15. /**

  16. * 小米代理商

  17. */

  18. public class MiPhoneAgent implements SellMobilePhone {

  19. //被代理者,工廠對象

  20. private SellMobilePhone factory;

  21. //通過構(gòu)造方法傳入被代理者

  22. public MiPhoneAgent(SellMobilePhone factory){

  23. this.factory = factory;

  24. }

  25. public void sellMobilePhone() {

  26. System.out.println("打廣告,做活動~~~~~~~~~~~~~~~~~");

  27. //調(diào)用被代理者的方法

  28. factory.sellMobilePhone();

  29. System.out.println("做售后,做推銷~~~~~~~~~~~~~~~~~");

  30. }

  31. }

  32. public class TestStaticProxy {

  33. @Test

  34. public void testProxy(){

  35. //創(chuàng)建被代理者

  36. SellMobilePhone factory = new MiPhoneFactory();

  37. factory.sellMobilePhone();

  38. System.out.println("---------------------------------------");

  39. //創(chuàng)建代理者

  40. SellMobilePhone agent = new MiPhoneAgent(factory);

  41. //調(diào)用賣手機(jī)

  42. agent.sellMobilePhone();

  43. }

  44. }

靜態(tài)代理的問題:

靜態(tài)代理只能適合一種業(yè)務(wù),如果有新的業(yè)務(wù),就必須創(chuàng)建新的接口和新的代理,如添加賣電腦的接口和電腦工廠,就要創(chuàng)建新的電腦代理類。

動態(tài)代理

動態(tài)代理的特點:

1) 在不修改原有類的基礎(chǔ)上,為原來類添加新的功能

2) 不需要依賴某個具體業(yè)務(wù)

動態(tài)代理分為:JDK動態(tài)代理和CGLib動態(tài)代理

區(qū)別是:

JDK動態(tài)代理的被代理者必須實現(xiàn)任意接口

CGLib動態(tài)代理不用實現(xiàn)接口,是通過繼承實現(xiàn)的

JDK動態(tài)代理

實現(xiàn)步驟:

1)代理類需要實現(xiàn)InvocationHandler接口

2)實現(xiàn)invoke方法

3)通過Proxy類的newProxyInstance方法來創(chuàng)建代理對象

  1. /**

  2. * 動態(tài)代理

  3. */

  4. public class SalesAgent implements InvocationHandler{

  5. //被代理者對象

  6. private Object object;

  7. /**

  8. * 創(chuàng)建代理對象

  9. * @param object 被代理者

  10. * @return 代理者

  11. */

  12. public Object createProxy(Object object){

  13. this.object = object;

  14. //Proxy.newProxyInstance創(chuàng)建動態(tài)代理的對象,傳入被代理對象的類加載器,接口,InvocationHandler對象

  15. return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),this);

  16. }

  17. /**

  18. * 調(diào)用被代理者方法,同時添加新功能

  19. */

  20. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

  21. System.out.println("銷售之前,打廣告~~~~~~");

  22. //調(diào)用被代理者的方法

  23. Object result = method.invoke(object,args);

  24. System.out.println("銷售之后,做售后~~~~~~");

  25. return result;

  26. }

  27. }

  28. public class TestInvocationHandler {

  29. @Test

  30. public void testInvocation(){

  31. //創(chuàng)建動態(tài)代理對象

  32. SalesAgent agent = new SalesAgent();

  33. //被代理對象

  34. SellMobilePhone sellMobilePhone = new MiPhoneFactory();

  35. //創(chuàng)建代理對象

  36. SellMobilePhone phoneProxy = (SellMobilePhone) agent.createProxy(sellMobilePhone);

  37. phoneProxy.sellMobilePhone();

  38. }

  39. }

CGLib動態(tài)代理

特點:通過繼承實現(xiàn),被代理者必須能被繼承,通過被代理類創(chuàng)建子類,子類就是父類的代理。

  1. /**

  2. * CGLib動態(tài)代理

  3. *

  4. */

  5. public class CGLibProxy implements MethodInterceptor {

  6. /**

  7. * 返回代理對象

  8. * @param object 被代理對象

  9. * @return 代理對象

  10. */

  11. public Object createProxy(Object object){

  12. //創(chuàng)建加強(qiáng)器

  13. Enhancer eh = new Enhancer();

  14. //設(shè)置被代理對象的類為父類

  15. eh.setSuperclass(object.getClass());

  16. //設(shè)置代理對象的回調(diào)

  17. eh.setCallback(this);

  18. return eh.create();

  19. }

  20. public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {

  21. System.out.println("售前~~~~~~CGLIB");

  22. //調(diào)用父類對象的方法

  23. Object res = proxy.invokeSuper(obj, args);

  24. System.out.println("售后~~~~~~CGLIB");

  25. return res;

  26. }

  27. }

“JDK和CGLib動態(tài)代理怎么實現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

分享文章:JDK和CGLib動態(tài)代理怎么實現(xiàn)
轉(zhuǎn)載注明:http://muchs.cn/article18/gdcjdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、網(wǎng)站制作動態(tài)網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)App設(shè)計、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都網(wǎng)站建設(shè)公司