JDK動態代理和Cglib動態代理的區別

這兩個動態代理都是在程序運行期間動態修改字節碼,然後通過反射創建出代理對象

JDK

JDK動態代理是基於接口實現的,也就是說,只有實現了接口的類,才能被JDK進行動態代理。
JDK會通過一個工廠類,生成代理類的二進制字節碼流,這個代理類呢,是Proxy的子類,並且實現了被代理類中實現的所有接口,同時實現了接口中的所有方法,這些方法的實現很簡單,直接調用了回調函數,也就是InvocationHandler接口中的invoke方法。在invoke方法裏,就可以完成方法的增強,以及可以通過反射調用方法。

Cglib

Cglib是基於繼承實現的,也就是說,代理類其實就是被代理類的子類。所以被代理類如果被final修飾的話,是無法使用Cglib進行代理的。
Cglib動態代理是字節碼操作,它是在程序運行時,使用asm字節碼框架,獲取到被代理類的字節碼,然後進行修改,最後生成子類。這個子類就作爲代理類,它裏面就重寫了被代理類的方法,在方法實現上直接執行回調函數,也就是MethodInterceptor的intercept方法。(所以被final修飾的方法也就是無法被代理的)在回調函數裏面可以完成方法增強以及方法調用,從而完成一次代理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章