動態代理:
概念:
依賴被代理對象B的字節碼信息,創建代理對象A,用戶對B的任意方法訪問必須經過A的處理。該方法實現了用戶與B類的隔離,在不修改源碼的基礎上(無侵入式的代碼擴展),對被代理對象的方法進行增強。
簡單點說就是,你作爲大臣遞給皇上的奏章,都被慈禧(代理對象)先看一遍並批改一下,才能給真正的皇上看(被代理對象)。
實現方法分類:
-
基於接口的動態代理
依賴類:Proxy(JDK官方)
使用條件:被代理對象B至少實現一個接口,否則不能使用
使用方法:使用Proxy類中的newProxyInstance方法,根據B類字節碼創建代理類A;
newProxyInstance方法的參數:
- ClassLoader:用於加載被代理對象字節碼中的類加載器,固定寫法,xx.getClass().getClassLoader();
- Class[]:字節碼數組,用於讓代理對象和被代理對象有相同的方法,固定寫法,xx.getClass().getInterfaces();
- InvocationHandler:用於提供增強的代碼,匿名內部類InvocationHandler,覆寫invoke()(這個函數就是下圖中的紅色菱形);
便於理解的示意圖:
-
基於子類的動態代理
依賴類:Enhancer(cglib第三方庫)
使用條件:被代理對象B不能是final
使用方法:使用Enhancer類中的create方法,根據B類字節碼創建代理類A
create方法的參數:
-
Class:被代理類B的字節碼,固定寫法,xx.getClass();
-
Callback:用於提供增強的代碼,使用匿名類MethodInterceptor,覆寫intercept()方法
原理圖同上。