1. 程式人生 > >關於動態代理的一點心得

關於動態代理的一點心得

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方法再用代理對象不就重復了嗎,再有,代理對象也需要通過原對象去訪問原對象的方法,所以這裏應該是原對象.

關於動態代理的一點心得