更新時間:2022-11-17 10:43:49 來源:動力節點 瀏覽706次
靜態代理通常是對原有業務邏輯的擴展。
代理的三要素
通用接口
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();
}
}
通過使用動態Proxy,我們可以在運行時動態生成一個持有RealObject并實現Proxy接口的Proxy,并注入相同的擴展邏輯。
使用動態代理
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 方法實現了要擴展的公共函數
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();
}
它們之間的區別
靜態代理只能用于相應的類。如果有很多類,則需要很多代理。動態代理就是為了彌補靜態代理的這一缺陷。通過使用動態Proxy,我們可以在運行時動態生成一個持有RealObject并實現Proxy接口的Proxy,并注入相同的擴展邏輯。即使你要Proxy的RealObject是不同的對象,甚至是不同的方法,你也可以使用動態Proxy來擴展功能。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習