Java基礎回顧:代理
阿新 • • 發佈:2021-10-17
1)靜態代理
代理模式為其他物件提供一種代理以控制對這個物件的訪問
通過靜態代理,我們達到了功能增強的目的,而且沒有侵入原始碼,這是靜態代理的一個優點。
*** JDK代理是基於實現介面的方式
主要涉及類和介面:
CGLIB建立動態代理類的模式是:
class Proxy extends Subject {
private RealSubject real;
@Override
public void Request() {
if (null == real) {
real = new RealSubject();
}
real.Request();
}
}
優點:訪問無法訪問的資源,增強現有的介面業務功能
缺點:大量使用這種靜態代理,會使我們系統內的類的規模增大,並且不易維護,這種代理在系統中存在,導致系統結構比較臃腫和鬆散。
2)動態代理 - JDK(通過實現介面的方式)- java.lang.reflect.Proxy
- java.lang.reflect.InvovationHandler
- 獲取RealSubject上所有的介面列表;
- 確定要生成的代理類的類名,預設為:com.sun.proxy.$ProxyXXXX;
- 根據需要實現的介面資訊,在程式碼中動態建立該Proxy類的位元組碼;
- 將對應的位元組碼轉換為對應的class物件;
- 建立 InvocationHandler 例項 handler,用來處理Proxy所有方法呼叫;
- Proxy的class物件以建立的handler為引數,例項化一個proxy物件。
- 查詢目標類上所有的非final的public型別的方法定義;
- 將這些方法定義轉成位元組碼;
- 將組成的位元組碼轉換成相應的代理的class物件;
- 實現MethodInterceptor介面,用來處理代理類上的所有方法請求
- 最小化依賴關係,減少依賴意味著簡化開發和維護,JDK本身支援,可能更可靠;
- 平滑進行JDK版本升級
- 程式碼實現簡單
- 無需實現介面,達到代理類無侵入
- 只操作我們關心的類
- 高效能
https://www.cnblogs.com/xrq730/p/6661692.html
一點浩然氣,千里快哉風!