動態(tài)代理的兩種方式

靜態(tài)代理就不說了,基本用到的都是動態(tài)代理。

Java中動態(tài)代理有JDK動態(tài)代理和CGLIB動態(tài)代理。

JDK代理的區(qū)別是,需要代理的類必須先繼承一個(gè)接口,接口里是這個(gè)類需要代理的方法,在被代理類里面實(shí)現(xiàn)接口中的方法(通過接口來暴露出需要代理的方法)。代理類需要實(shí)現(xiàn)InvocationHandler這個(gè)接口,實(shí)現(xiàn)里面的invoke方法,在這個(gè)方法中可以在代理方法前后執(zhí)行一些額外的操作。而獲得代理類是需要被代理類實(shí)現(xiàn)的那個(gè)接口的信息。所以實(shí)際上,JDK是通過接口來創(chuàng)建代理類,所以被代理的類必須實(shí)現(xiàn)至少一個(gè)接口。

CGLIB可以代理沒有實(shí)現(xiàn)任何接口的類。因?yàn)镃GLIB是通過Enhancer類來創(chuàng)建被代理類的子類,在用實(shí)現(xiàn)MethodInterceptor接口并且重寫intercept方法的類來設(shè)置回調(diào)函數(shù),在intercept里面可以在被代理類方法的前后執(zhí)行額外的操作。每當(dāng)被代理類的方法執(zhí)行時(shí)都會進(jìn)行回調(diào)操作,被代理類的所有方法都會被代理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容