反射與代理設計模式-動態代理設計模式
動態代理設計模式的核心特點:一個代理類可以代理所有需要被代理介面的子類對象。
如果要想進行動態代理設計的實現,代理類不再具體實現於某一個介面。
我們需要實現InvocationHandler動態代理實現標識介面,只有實現此介面的子類才具備動態代理的功能。
public Object invoke(Object proxy, Method method, Object[] args);
invoke()表示的是調用執行的方法,但是所有的代理類返回給用戶的介面對象都屬於代理對象,當用戶執行介面方法的時候所調用的實例化對象就是該代理主題動態創建的一個介面對象。
proxy 表示的是被代理的對象信息。
method 返回的是被調用的方法對象,取得了Method對象意味著可以使用invoke()反射調用方法。
args 表示方法中收到的參數
如果要想進行對象的綁定,那麼就需要使用到一個Proxy的程序類,這個程序類的主要功能是可以綁定所有的你需要綁定的介面子類的對象,而且這些對象都是根據介面自動創建的,該類有一個動態創建的方法:
public static Object newProxyInstance(ClassLoader loader,
Class[] interfaces,
InvocationHandler h)
throws IllegalArgumentException
實現真實對象的綁定處理,同時返回代理對象。(這個對象是根據介面定義動態創建形成的代理對象)。
保存真實主題對象。
/**
* 實現真實對象的綁定處理,同時返回代理對象
* @param target
* @return 返回一個代理對象(這個對象是根據介面定義動態創建形成的代理對象)
*/
public Object bind(Object target) {
this.target = target; //保存真實主題對象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
動態代理設計實現:
import java.util.Arrays;
//代理設計的核心在於需要有一個核心的操作介面
interface ISubject {
//直返是整體的核心業務
public void eat(String msg,int num);
}
class RealSubject implements ISubject {
@Override
public void eat(String msg,int num) {
}
}
class ProxySubject implements InvocationHandler {//動態代理類
private Object target; //綁定任意的介面對象,使用Object描述
/**
* 實現真實對象的綁定處理,同時返回代理對象
* @param target
* @return 返回一個代理對象(這個對象是根據介面定義動態創建形成的代理對象)
*/
public Object bind(Object target) {
this.target = target; //保存真實主題對象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
}
public void prepare() {
}
public void over() {
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
this.prepare();
Object ret = method.invoke(this.target, args);
this.over();
return ret;
}
}
public class ProxyDesign {
public static void main(String[] args) {
ISubject subject = (ISubject)new ProxySubject().bind(new RealSubject());
subject.eat("吃肉", 20);
}
}
TAG:Adolph談JAVA高端 |