關於動態代理的一點心得
阿新 • • 發佈:2017-05-15
ade his ref logs urn err over 關於 pre
剛學習的時候總是搞不明白動態代理中哪個是代理對象,哪個是原來的對象,最近搞明白了,特地來記錄下,很淺顯,希望能夠幫助大家
一. 先寫一個接口,就叫Function,包括睡覺和吃飯方法
package dynamicProxy; public interface Function { public void sleep(); public String eat(String name); }
二.再寫一個實現類,就叫dog
package dynamicProxy; public class Dog implements Function { @Override public void sleep() { System.out.println("小狗睡覺"); } @Override public String eat(String name) { return "小狗吃"+name; } }
三,我們再寫一個類實現invocationHandler,裏面的bind方法是獲取代理對象的
package dynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class MyInvocationHandler implements InvocationHandler{ private Object obj; public Object bind(Object obj){ this.obj=obj; Object proxy= Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this); System.out.println("綁定方法中的obj:"+obj.getClass().getName()); System.out.println("綁定方法中的proxy:"+proxy.getClass().getName()); return proxy; } @Override public Object invoke(Object obj, Method method, Object[] args) throws Throwable { System.out.println("代理方法中的obj:"+obj.getClass().getName()); System.out.println("代理類中的obj:"+this.obj.getClass().getName()); Object invoke = method.invoke(this.obj, args); return invoke; } }
4.最後測試
package dynamicProxy; public class TestProxy { public static void main(String[] args) { MyInvocationHandler mh=new MyInvocationHandler(); Function dog = (Function) mh.bind(new Dog()); dog.sleep(); } }
5.結果 控制臺:
綁定方法中的obj:dynamicProxy.Dog
綁定方法中的proxy:$Proxy0
代理方法中的obj:$Proxy0
代理類中的obj:dynamicProxy.Dog
小狗睡覺
這就充分說明了,invoke方法理的obj是代理對象,並不是原來的對象,一開始我把method中invoke方法寫成了obj,導致報錯,因為這個是代理對象,而這裏必須要用原對象,
我是這麽理解的,如有不當還請指正:當我們用bind方法的時候獲取的就是代理對象(綁定方法中打印的是:$Proxy0),當我們用代理對象調用方法的時候會自動調到invoke方法,如果這個時候invoke方法再用代理對象不就重復了嗎,再有,代理對象也需要通過原對象去訪問原對象的方法,所以這裏應該是原對象.
關於動態代理的一點心得