CGLib動態代理原理及實現
JDK實現動態代理需要實現類通過介面定義業務方法,對於沒有介面的類,如何實現動態代理呢,這就需要CGLib了。CGLib採用了非常底層的位元組碼技術,其原理是通過位元組碼技術為一個類建立子類,並在子類中採用方法攔截的技術攔截所有父類方法的呼叫,順勢織入橫切邏輯。JDK動態代理與CGLib動態代理均是實現Spring AOP的基礎。
簡單的實現舉例:
這是一個需要被代理的類,也就是父類,通過位元組碼技術建立這個類的子類,實現動態代理。
public class SayHello {
public void say(){
System.out.println("hello everyone");
}
}
該類實現了建立子類的方法與代理的方法。getProxy(SuperClass.class)方法通過入參即父類的位元組碼,通過擴充套件父類的class來建立代理物件。intercept()方法攔截所有目標類方法的呼叫,obj表示目標類的例項,method為目標類方法的反射物件,args為方法的動態入參,proxy為代理類例項。proxy.invokeSuper(obj, args)通過代理類呼叫父類中的方法。
public class CglibProxy implements MethodInterceptor{
private Enhancer enhancer = new Enhancer();
public Object getProxy(Class clazz){
//設定需要建立子類的類
enhancer.setSuperclass(clazz);
enhancer.setCallback(this);
//通過位元組碼技術動態建立子類例項
return enhancer.create();
}
//實現MethodInterceptor介面方法
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("前置代理");
//通過代理類呼叫父類中的方法
Object result = proxy.invokeSuper(obj, args);
System.out.println("後置代理");
return result;
}
}
具體實現類:
public class DoCGLib {
public static void main(String[] args) {
CglibProxy proxy = new CglibProxy();
//通過生成子類的方式建立代理類
SayHello proxyImp = (SayHello)proxy.getProxy(SayHello.class);
proxyImp.say();
}
}
輸出結果:
前置代理
hello everyone
後置代理
CGLib建立的動態代理物件效能比JDK建立的動態代理物件的效能高不少,但是CGLib在建立代理物件時所花費的時間卻比JDK多得多,所以對於單例的物件,因為無需頻繁建立物件,用CGLib合適,反之,使用JDK方式要更為合適一些。同時,由於CGLib由於是採用動態建立子類的方法,對於final方法,無法進行代理。
相關文章
- spring aop原理 JDK動態代理和CGLIB動態代理SpringJDKCGLib
- 【深度思考】聊聊CGLIB動態代理原理CGLib
- CGLib 動態代理CGLib
- Java JDK 動態代理使用及實現原理分析JavaJDK
- JDK 和 CGLib 實現動態代理和區別JDKCGLib
- Java代理(jdk靜態代理、動態代理和cglib動態代理)JavaJDKCGLib
- 動態代理-cglib分析CGLib
- JDK動態代理和 CGLIB 代理JDKCGLib
- JDK動態代理和CGLib代理JDKCGLib
- Java JDK 動態代理(AOP)使用及實現原理分析JavaJDK
- 3.靜態代理&動態代理&CGlibCGLib
- Java動態代理 jdk和cglib的實現比較JavaJDKCGLib
- 代理模式詳解:靜態代理、JDK動態代理與Cglib動態代理模式JDKCGLib
- (轉)Java動態代理與CGLib代理JavaCGLib
- Java-JDK動態代理(AOP)使用及實現原理分析JavaJDK
- CGlib動態代理複習CGLib
- RPC核心實現原理-動態代理RPC
- 靜態代理和動態代理(jdk/cglib)詳解JDKCGLib
- Java進階之 JDK動態代理與Cglib動態代理JavaJDKCGLib
- Java動態代理(JDK和cglib)JavaJDKCGLib
- 細說JDK動態代理的實現原理JDK
- 你必須會的 JDK 動態代理和 CGLIB 動態代理JDKCGLib
- 聊聊cglib動態代理遇到的坑CGLib
- CGlib動態代理-簡單介紹CGLib
- 設計模式之cglib動態代理設計模式CGLib
- cglib動態代理和jdk動態代理的區別與應用CGLibJDK
- Java 靜態代理和動態代理的使用及原理解析Java
- Spring原始碼剖析5:JDK和cglib動態代理原理詳解Spring原始碼JDKCGLib
- HTTP 代理原理及實現(2)HTTP
- 由《尋秦記》說代理模式(靜態,動態,CGLib)模式CGLib
- 動態代理jdk和cglib的區別JDKCGLib
- 【Spring AOP】AOP 底層實現原理 —— 動態代理類的建立(JDK、CGlib)、工廠如何加工原始物件SpringJDKCGLib物件
- 最詳細的代理講解--JDK動態代理和cglib代理JDKCGLib
- JDK動態代理實現原理詳解(原始碼分析)JDK原始碼
- 【乾貨】JDK動態代理的實現原理以及如何手寫一個JDK動態代理JDK
- Spring動態代理的生成-如何判斷是使用JDK動態代理還是CGlib代理SpringJDKCGLib
- 基於 CGLIB 庫的動態代理機制CGLib
- Android 動態代理以及利用動態代理實現 ServiceHookAndroidHook