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