首页 > 代码库 > 关于动态代理的一点心得

关于动态代理的一点心得

刚学习的时候总是搞不明白动态代理中哪个是代理对象,哪个是原来的对象,最近搞明白了,特地来记录下,很浅显,希望能够帮助大家

 

一. 先写一个接口,就叫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方法再用代理对象不就重复了吗,再有,代理对象也需要通过原对象去访问原对象的方法,所以这里应该是原对象.

关于动态代理的一点心得