摘要:代理模式概念代理模式分為兩種,一種是靜態代理模式,一種是動態代理模式。面向切面的編程也是使用動態代理模式來實現的。
1.代理模式概念
代理模式分為兩種,一種是靜態代理模式,一種是動態代理模式。 靜態代理模式:在程序運行之前需要寫好代理類 動態代理模式:在程序運行期間動態生成代理類2.動態代理的實現
動態代理實現的步驟: (1)寫一個代理類SubjectHandler實現InvocationHandler接口,重寫invoke方法, 通過構造函數把代理的對象realSubject傳入到此處理類中, 在invoke方法中增加method.invoke(realSubject, args);
public interface Subject { public void rent(); }
public class RealSubject implements Subject { @Override public void rent() { System.out.println("I want to rent my house"); } }
public class SubjectHandler implements InvocationHandler { private Subject subject; public SubjectHandler(Subject subject) { this.subject = subject; } @Override public Object invoke(Object object, Method method, Object[] args) throws Throwable { System.out.println("before rent house"); method.invoke(subject, args); System.out.println("after rent house"); return null; } }
(2)在調用方法中增加代碼即可完成調用
public class Client { public static void main(String[] args) { RealSubject realSubject = new RealSubject(); //生成代理類的對象 Subject subject = (Subject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), new SubjectHandler(realSubject)); subject.rent(); //調用代理類的方法 } } //第一個參數為realSubject的classloader //第二個參數為realSubject的所有接口 //第三個參數為處理類
上面的內容是幾年前在網上看到的,具體出自那篇文章忘記了,動態代理的處理過程大體如上。
3.動態代理的實現過程通過看馬士兵的設計模式中的代理模式教程,對代理模式的內部實現原理有了更清楚的認識,下面的圖片是自己總結的代理類的產生過程:
下面的代碼來自馬士兵關于動態代理講解的源碼
//模擬代理類的實現代碼 //把出來的內容寫入文件中 String fileName = "d:/src/com/proxy/$Proxy1.java"; File f = new File(fileName); FileWriter fw = new FileWriter(f); fw.write(src); fw.flush(); fw.close(); //編譯文件, JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager fileMgr = compiler.getStandardFileManager(null, null, null); Iterable units = fileMgr.getJavaFileObjects(fileName); CompilationTask t = compiler.getTask(null, fileMgr, null, null, null, units); t.call(); fileMgr.close(); //把class文件加載到內存中,通過構造方法生成代理的對象 URL[] urls = new URL[] {new URL("file:/" + "d:/src/")}; URLClassLoader ul = new URLClassLoader(urls); Class c = ul.loadClass("com.proxy.$Proxy1"); System.out.println(c); Constructor ctr = c.getConstructor(InvocationHandler.class); Object m = ctr.newInstance(h); return m;
在生成的代理類中對應的方法如下
private static Method m0; public final void rent() { try { super.h.invoke(this, m0, null); return; } catch (Error e) { } catch (Throwable throwable) { throw new UndeclaredThrowableException(throwable); } }
從上面我們可以看出,生成的代理對象subject 調用rent方法,其實是調用的上面代理類中生成的rent方法,在rent方法中調用了SubjectHandler 的invoke方法,通過上面的流程梳理,對于代理模式理解就更容易一些。
spring aop面向切面的編程也是使用動態代理模式來實現的。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67265.html
摘要:與靜態代理對比,動態代理是在動態生成代理類,由代理類完成對具體方法的封裝,實現的功能。本文將分析中兩種動態代理的實現方式,和,比較它們的異同。那如何動態編譯呢你可以使用,這是一個封裝了的庫,幫助你方便地實現動態編譯源代碼。 發現Java面試很喜歡問Spring AOP怎么實現的之類的問題,所以寫一篇文章來整理一下。關于AOP和代理模式的概念這里并不做贅述,而是直奔主題,即AOP的實現方...
摘要:這種語法,在中被稱為動態代理。在動態代理機制中,這個角色只能是接口。動態代理就是實現的技術之一。 所謂動態代理,指的是語言提供的一種語法,能夠將對對象中不同方法的調用重定向到一個統一的處理函數中來。python重寫__getattr__函數能夠做到這一點,就連世界上最好的語言也提供稱為魔術方法的__call。這種語法除了能更好的實現動態代理外,還是RPC框架實現原理的一部分。 動態代理...
摘要:代理模式代理模式通俗一點的解釋就是在操作一個對象和對象中的方法時,不是直接操作這個對象,還是通過一個代理對象來操作這個實際的目標對象。 代理模式: 代理模式通俗一點的解釋就是在操作一個對象和對象中的方法時,不是直接操作這個對象,還是通過一個代理對象來操作這個實際的目標對象。應用場景一般是需要在執行某個已經寫好的方法前后再添加一段邏輯,比如執行方法前打印日志,或者在執行方法之前和之后打時...
摘要:代理模式從類型上來說,可以分為靜態代理和動態代理兩種類型。然而今天的重點是我們都知道牛逼轟轟的的實現的一種方式是使用的動態代理另一種是,大部分人也會用的動態代理,不過沒有研究過的動態代理到底是怎么實現的。 動態代理 代理模式是設計模式中非常重要的一種類型,而設計模式又是編程中非常重要的知識點,特別是在業務系統的重構中,更是有舉足輕重的地位。代理模式從類型上來說,可以分為靜態代理和動態代...
摘要:動態代理又被稱為代理或接口代理。靜態代理在編譯時產生字節碼文件,可以直接使用,效率高。代理無需實現接口,通過生成類字節碼實現代理,比反射稍快,不存在性能問題,但會繼承目標對象,需要重寫方法,所以目標對象不能為類。 一、代理模式介紹 代理模式是一種設計模式,提供了對目標對象額外的訪問方式,即通過代理對象訪問目標對象,這樣可以在不修改原目標對象的前提下,提供額外的功能操作,擴展目標對象的功...
閱讀 3108·2021-02-22 17:12
閱讀 729·2019-08-30 15:55
閱讀 3110·2019-08-30 15:54
閱讀 1399·2019-08-29 16:56
閱讀 1870·2019-08-29 15:13
閱讀 1731·2019-08-29 13:19
閱讀 611·2019-08-26 13:40
閱讀 2830·2019-08-26 10:26