关于动态代理的一点心得
刚学习的时候总是搞不明白动态代理中哪个是代理对象,哪个是原来的对象,最近搞明白了,特地来记录下,很浅显,希望能够帮助大家
一. 先写一个接口,就叫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方法再用代理对象不就重复了吗,再有,代理对象也需要通过原对象去访问原对象的方法,所以这里应该是原对象.