在Spring中的AOP是依靠動(dòng)態(tài)代理來(lái)實(shí)現(xiàn)切面編程的.
而這兩者又是有區(qū)別的.
JDK是基于反射機(jī)制,生成一個(gè)實(shí)現(xiàn)代理接口的匿名類,然后重寫方法,實(shí)現(xiàn)方法的增強(qiáng).
它生成類的速度很快,但是運(yùn)行時(shí)因?yàn)槭腔诜瓷?調(diào)用后續(xù)的類操作會(huì)很慢.
而且他是只能針對(duì)接口編程的.
CGLIB是基于繼承機(jī)制,繼承被代理類,所以方法不要聲明為final,然后重寫父類方法達(dá)到增強(qiáng)了類的作用.
它底層是基于asm第三方框架,是對(duì)代理對(duì)象類的class文件加載進(jìn)來(lái),通過(guò)修改其字節(jié)碼生成子類來(lái)處理.
生成類的速度慢,但是后續(xù)執(zhí)行類的操作時(shí)候很快.
可以針對(duì)類和接口.
具體應(yīng)用:
如果目標(biāo)對(duì)象實(shí)現(xiàn)了接口,默認(rèn)情況下是采用JDK動(dòng)態(tài)實(shí)現(xiàn)AOP
如果目標(biāo)對(duì)象沒(méi)有實(shí)現(xiàn)接口,必須采用CGLIB庫(kù).
什么是反射?
反射是可以在運(yùn)行時(shí)期動(dòng)態(tài)獲取任何類的信息,如屬性和方法.
反射是可以在運(yùn)行時(shí)期動(dòng)態(tài)調(diào)用任何類的屬性和方法.
這種動(dòng)態(tài)調(diào)用獲取信息和動(dòng)態(tài)調(diào)用類的方法叫做反射.
反射有什么優(yōu)點(diǎn)?
反射可以動(dòng)態(tài)訪問(wèn)和調(diào)用類的方法和屬性,而不局限于硬編碼.提高了程序的擴(kuò)展性,降低耦合度.允許程序創(chuàng)建可控制任何對(duì)象.
反射有什么缺點(diǎn)?
性能問(wèn)題
內(nèi)部暴露問(wèn)題,因?yàn)榭梢栽L問(wèn)私有變量,出現(xiàn)問(wèn)題
安全限制:使用反射技術(shù)要求程序必須在一個(gè)沒(méi)有安全限制的環(huán)境中運(yùn)行。如果一個(gè)程序必須在有安全限制的環(huán)境中運(yùn)行,如 Applet就不能用反射了。
參考:https://blog.csdn.net/cnzl0123/article/details/73459750
問(wèn)題:Java反射機(jī)制可以動(dòng)態(tài)修改實(shí)例中final修飾的成員變量嗎?
回答是分兩種情況的。
當(dāng)final修飾的成員變量在**定義的時(shí)候就初始化了值**,那么java反射機(jī)制就已經(jīng)不能動(dòng)態(tài)修改它的值了。
當(dāng)final修飾的成員變量在定義的時(shí)候并**沒(méi)有初始化值**的話,那么就還能通過(guò)java反射機(jī)制來(lái)動(dòng)態(tài)修改它的值。
參考:https://blog.csdn.net/qq_38409944/article/details/88776925