摘要:在代理實例上調用方法時,方法調用將被轉發到的方法動態代理實現的代理模式必須有一個的接口方法代理類實現類的實現方式是一個基于的字節碼生成庫,它允許我們在運行時對字節碼進行修改和動態生成。
動態代理是使用反射和字節碼的技術,在運行期創建指定接口或類的子類(動態代理)以及其實例對象的技術,通過這個技術可以無侵入性的為代碼進行增強
Proxy:Proxy是所有動態代理的父類,它提供了一個靜態方法來創建動態代理的class對象和實例;
InvocationHandler:每個動態代理實例都有一個關聯的InvocationHandler。 在代理實例上調用方法時,方法調用將被轉發到InvocationHandler的invoke方法;
1.java 動態代理實現
//java的代理模式必須有一個interface的接口方法 public interface ItemService { void sayHello(); } public class ItemServiceImpl implements ItemService { @Override public void sayHello() { System.out.println("hello world~"); } } //代理類 public class MyInvocationHandler implements InvocationHandler { private Object realObject; public void setRealObject(Object realObject) { this.realObject = realObject; } public Object getRealObject() { return realObject; } public MyInvocationHandler(Object realObject){ super(); this.realObject=realObject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before running ~~"); Object ret=method.invoke(realObject,args); System.out.println("after running ~~~"); return ret; } } // 實現類 public class main { public static void main(String[] args) { ItemService itemService=new ItemServiceImpl(); MyInvocationHandler handler=new MyInvocationHandler(itemService); ItemService proxy= (ItemService) Proxy.newProxyInstance(itemService.getClass().getClassLoader(),itemService.getClass().getInterfaces(),handler); proxy.sayHello(); } }
2.CGLIB的實現方式
CGLIB(Code Generation Library)是一個基于ASM的字節碼生成庫,它允許我們在運行時對字節碼進行修改和動態生成。CGLIB通過繼承方式實現代理;
Enhancer:來指定要代理的目標對象、實際處理代理邏輯的對象,最終通過調用create()方法得到代理對象,對這個對象所有非final方法的調用都會轉發給MethodInterceptor;
MethodInterceptor:動態代理對象的方法調用都會轉發到intercept方法進行增強;
//1.需要引入//2.方法 public class ItemServiceImpl { void sayHello(String name) { System.out.println("hello world~"+name); } } //3.cglib代理實現類 public class MyInterceptor implements MethodInterceptor { private Object realObject; public void setRealObject(Object realObject) { this.realObject = realObject; } public Object getRealObject() { return realObject; } public MyInterceptor(Object realObject){ this.realObject=realObject; } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("before running ~~"); System.out.println(method); System.out.println(Arrays.toString(objects)); Object ret=methodProxy.invoke(realObject,objects); System.out.println("after running ~~"); return ret; } } //4.實現類 public class main { public static void main(String[] args) { ItemServiceImpl itemService=new ItemServiceImpl(); Enhancer enhancer=new Enhancer(); enhancer.setSuperclass(ItemServiceImpl.class); enhancer.setCallback(new MyInterceptor(itemService)); ItemServiceImpl imp= (ItemServiceImpl) enhancer.create(); imp.sayHello("張三"); } } cglib cglib 3.2.6
總結:
JDK原生動態代理是Java原生支持的,不需要任何外部依賴,但是它只能基于接口進行代理;
CGLIB通過繼承的方式進行代理,無論目標對象有沒有實現接口都可以代理,但是無法處理final的情況
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73743.html
摘要:動態代理又被稱為代理或接口代理。靜態代理在編譯時產生字節碼文件,可以直接使用,效率高。代理無需實現接口,通過生成類字節碼實現代理,比反射稍快,不存在性能問題,但會繼承目標對象,需要重寫方法,所以目標對象不能為類。 一、代理模式介紹 代理模式是一種設計模式,提供了對目標對象額外的訪問方式,即通過代理對象訪問目標對象,這樣可以在不修改原目標對象的前提下,提供額外的功能操作,擴展目標對象的功...
摘要:設計模式之代理模式今天學到的動態代理實現,對代理這個概念很模糊,看了一篇文章發現這是一種設計模式,于是學習記錄一下。簡介代理模式是一種對象結構型的模式,主要為其他對象提供一種代理以控制對這個對象的訪問。下面依次講解著三種代理。 設計模式之代理模式 今天學到Spring的動態代理實現AOP,對代理這個概念很模糊,看了一篇文章發現這是一種設計模式,于是學習記錄一下。 簡介 代理模式是一種對...
摘要:除了和外,我們還有最后一招我直接把一個代理類的源代碼用字符串拼出來,然后基于這個字符串調用的編譯期,動態的創建一個新的文件,然后動態編譯這個文件,這樣也能得到一個新的代理類。 面試問題:Java里的代理設計模式(Proxy Design Pattern)一共有幾種實現方式?這個題目很像孔乙己問茴香豆的茴字有哪幾種寫法? showImg(https://segmentfault.com/...
摘要:與靜態代理對比,動態代理是在動態生成代理類,由代理類完成對具體方法的封裝,實現的功能。本文將分析中兩種動態代理的實現方式,和,比較它們的異同。那如何動態編譯呢你可以使用,這是一個封裝了的庫,幫助你方便地實現動態編譯源代碼。 發現Java面試很喜歡問Spring AOP怎么實現的之類的問題,所以寫一篇文章來整理一下。關于AOP和代理模式的概念這里并不做贅述,而是直奔主題,即AOP的實現方...
摘要:動態代理的核心是接口和類。以上結果說明它生成的代理類為,說明是代理。測試前提實現接口測試類使用接口方式注入代理方式必須以接口方式注入測試配置為,運行結果如下實際校驗邏輯。。。。 本文也同步發布至簡書,地址:https://www.jianshu.com/p/f70... AOP設計模式通常運用在日志,校驗等業務場景,本文將簡單介紹基于Spring的AOP代理模式的運用。 1. 代理模...
閱讀 2924·2021-11-23 09:51
閱讀 3099·2021-11-15 11:39
閱讀 2979·2021-11-09 09:47
閱讀 2527·2019-08-30 13:49
閱讀 2113·2019-08-30 13:09
閱讀 3092·2019-08-29 16:10
閱讀 3504·2019-08-26 17:04
閱讀 984·2019-08-26 13:57