1. 程式人生 > >Java動態代理再理解

Java動態代理再理解

這是我理解的動態代理的原理圖:

動態代理例項:

public class TestProxy {
	public static void main(String[] args) {
		//被代理物件
		RealSubject rs = new RealSubject();
		//建立一個實現了InvocationHandler 的代理類物件
		MyInvocationHandler myInvocationHandler = new MyInvocationHandler(rs);
		//建立被代理物件(結合原理圖,可以理解,動態生成的位元組碼需要類載入器重新載入才可以生成Java相關物件)
		Object obj = Proxy.newProxyInstance(rs.getClass().getClassLoader(), rs.getClass().getInterfaces(), myInvocationHandler);
		Subject subject = (Subject) obj;
		//通過反射執行被代理類的相關方法(並新增相應的附加業務邏輯)
		subject.action();
	
	}
}
interface Subject{
	void action();
}
class RealSubject implements Subject{

	@Override
	public void action() {
		System.out.println("我是被代理類");
	}	
}
//動態代理類(凡是很動態代理相關的都與這個InvocationHandler介面有關係)
class MyInvocationHandler implements InvocationHandler{

	Object obj;	
	
	public MyInvocationHandler(Object obj) {
		this.obj = obj;
	}
	//當通過代理類物件發起對被重寫的被代理類的方法進行呼叫的時候,都會轉化成如下的invoke()方法的呼叫
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		//method 方法的返回值是 returnValue
		System.out.println("代理類執行之前,所呼叫的方法名是:"+method.getName()+"的方法的執行");
		Object returnValue = method.invoke(obj, args);
		return returnValue;
	}	
}