這幾天看視頻看到了java的動態代理,這里寫一個小例子。在寫例子的時候發現:認為自己會了,和能寫出來真不是一個概念。還是要多寫代碼,然后寫博客再深入一些,費曼學習法--教,是最好的學。
1.什么是動態代理
代理模式
代理模式是常用的java設計模式,他的特征是代理類與委托類有同樣的接口,代理類主要負責為委托類預處理消息、過濾消息、把消息轉發給委托類,以及事后處理消息等。代理類與委托類之間通常會存在關聯關系,一個代理類的對象與一個委托類的對象關聯,代理類的對象本身並不真正實現服務,而是通過調用委托類的對象的相關方法,來提供特定的服務。
按照代理的創建時期,代理類可以分為兩種。
靜態代理:由程序員創建或特定工具自動生成源代碼,再對其編譯。在程序運行前,代理類的.class文件就已經存在了。
動態代理:在程序運行時,運用反射機制動態創建而成。
2.動態代理的Demo
首先創建一個接口,PersonDao
public interface PersonDao { public void say(); }
然后寫一個實現類PersonDaoImpl
public class PersonDaoImpl implements PersonDao{ @Override public void say() { System.out.println("time to eat"); } }
然后寫個使用類PersonHandler
public class PersonHandler implements InvocationHandler { private Object obj; public PersonHandler(Object obj){ this.obj=obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before"); Object result = method.invoke(obj, args); System.out.println("after"); return result; } }
PersonHandler必須要實現InvocationHandler接口
然后 再寫個測試類
public class PersonTest { @Test public void test(){ PersonDao pDao = new PersonDaoImpl(); PersonHandler handler = new PersonHandler(pDao); PersonDao proxy = (PersonDao)Proxy.newProxyInstance(pDao.getClass().getClassLoader(), pDao.getClass().getInterfaces(), handler); proxy.say(); } }最后控制台輸出

至於具體細節,可能要研究一下源碼了,有時間再說吧