CGLIB(Code Generator Library)是個代碼生成庫,底層使用ASM來操作位元組碼生成新的類。
JDK動态代理通過java原生的反射API進行操作,在生成類上比較高效,
CGLIB通過ASM直接對位元組碼進行操作,在類的執行過程上比較高效。
Enhancer既能夠代理普通類,也可以代理接口。
Enhancer生成被代理類的子類,并所有的方法調用(包括從Object繼承的hashCode、equals和toString)
Enhancer不能攔截final類、final方法
Callback是一個空接口,有6種接口繼承Callback
1、MethodInterceptor:
代理類的所有方法調用都會轉而執行這個接口中的intercept方法而不是原方法。
2、NoOp:
将方法調用委托給被代理類的原方法,沒其他操作
3、LazyLoader:
在第一次被代理類的方法調用時觸發,它傳回一個代理類的對象,這個對象會被存儲起來然後負責所有被代理類方法的調用,一種lazy模式。
4、Dispatcher:
在每次發生對原方法的調用時都會被調用并傳回一個代理對象來調用原方法。
5、InvocationHandler:
跟java.lang.reflect.InvocationHandler用法一樣
6、FixedValue:
攔截所有方法并傳回相同的值
執行結果
生成三個class檔案
每個被代理方法都有一個MethodProxy對象,這個代理方法對象是怎麼定位到對應的方法和MethodInterceptor
JDK動态代理攔截需要增強的方法,并通過反射調用該方法。CGLIB會為被代理類和代理類(兩者都是委托類)分别動态生成一個FastClass(abstract)子類,在FastClass子類中會為各自的委托類中的方法建立索引值。調用者根據方法簽名或者方法名+參數類型的方式得到索引值,再通過索引值定位到執行語句,并傳回結果。
9bb75a71是FastClass的子類執行個體,這個類和動态代理并沒有關聯,隻是通過DelegateClass檢視動态生成的FastClass子類的結構
注: 為了友善檢視,将第一個案例中Cat的FastClass子類,和Cat代理類的FastClass子類一塊貼過來
被代理類FastClass子類
代理類的FastClass子類