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

一. 問題背景

面試題可能會問到AOP,然後其中涉及了動態代理,所以描述完了aop實現了哪些功能後,最好回答一下jdk動態代理和cglib代理的區別

參考自:

  1. Spring AOP中的JDK和CGLib動態代理哪個效率更高?

  2. JDK和Cglib實現動態代理優缺點分析和Java的三種代理模式

  3. CGlib

二. 兩者的區別

jdk動態代理是生成一個目標類的代理類,而且代理類必須實現 目標類實現的接口,所以如果目標類沒有實現接口的話,使用jdk動態代理可能不太合適,因爲它生存不了代理類。jdk動態代理是通過反射實現的,反射比一般的函數開銷要大一點,所以性能上可能稍微慢一點。

cglib代理是生成目標類的子類,cglib會使用字節碼的一個編譯器(也就是ASM,ASM能夠改造既有類,直接生成需要的代碼。增強的代碼是硬編碼在新生成的類文件內部。沒有反射代理性能上的付出),在性能上cglib創建對象的過程中,可能就是做的更慢一些,但是運行時效率可能會高一些。

在jdk1.6、1.7的時候,jdk代理的性能可能比cglib的速度要慢;但是在jdk1.8時,jdk代理比cglib的速度快很多了。

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