更新時間:2022-11-17 10:43:49 來源:動力節(jié)點 瀏覽852次
靜態(tài)代理通常是對原有業(yè)務邏輯的擴展。
代理的三要素
通用接口
public interface Action {
public void doSomething();
}
實物
public class RealObject implements Action{
public void doSomething() {
System.out.println("do something");
}
}
代理對象
public class Proxy implements Action {
private Action realObject;
public Proxy(Action realObject) {
this.realObject = realObject;
}
public void doSomething() {
System.out.println("proxy do");
realObject.doSomething();
}
}
通過使用動態(tài)Proxy,我們可以在運行時動態(tài)生成一個持有RealObject并實現(xiàn)Proxy接口的Proxy,并注入相同的擴展邏輯。
使用動態(tài)代理
public class DynamicProxyHandler implements InvocationHandler {
private Object realObject;
public DynamicProxyHandler(Object realObject) {
this.realObject = realObject;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//Agent extension logic
System.out.println("proxy do");
return method.invoke(realObject, args);
}
}
invoke 方法實現(xiàn)了要擴展的公共函數(shù)
public static void main(String[] args) {
RealObject realObject = new RealObject();
Action proxy = (Action) Proxy.newProxyInstance(ClassLoader.getSystemClassLoader(), new Class[]{Action.class}, new DynamicProxyHandler(realObject));
proxy.doSomething();
}
它們之間的區(qū)別
靜態(tài)代理只能用于相應的類。如果有很多類,則需要很多代理。動態(tài)代理就是為了彌補靜態(tài)代理的這一缺陷。通過使用動態(tài)Proxy,我們可以在運行時動態(tài)生成一個持有RealObject并實現(xiàn)Proxy接口的Proxy,并注入相同的擴展邏輯。即使你要Proxy的RealObject是不同的對象,甚至是不同的方法,你也可以使用動態(tài)Proxy來擴展功能。