《AspectJ Cookbook》讀書(shū)筆記十一: 捕獲基于對(duì)象的連接點(diǎn)
this([Type | Identifier])研究的是在捕捉的連接點(diǎn)處由this引用的對(duì)象的類型。連接點(diǎn)的目標(biāo)(通過(guò)target([Type | Identifier])切入點(diǎn)指定)依賴于連接點(diǎn)類型而有所不同,但它常常是在其上調(diào)用方法的對(duì)象,或者是以某種方式訪問(wèn)的在其中遇到連接點(diǎn)的屬性。連接點(diǎn)args(通過(guò)args([Types | identieters])切入點(diǎn)指定)就是在捕捉的連接點(diǎn)處可用的參數(shù)。
可以用兩種方式之一研究this,target和args引用的類型:使用靜態(tài)Type指示,或者使用一個(gè)Identifier,它引用一個(gè)實(shí)際的運(yùn)行時(shí)對(duì)象。
Type指示對(duì)連接點(diǎn)處的對(duì)象類型提供了一個(gè)靜態(tài)編譯時(shí)評(píng)估,并且采用完全限定類名的形式(例如,com.oreilly.Foo是可接受的,但是Foo或Foo.class則不可接受)。
Identifiers提供了一種方法,可以通過(guò)它來(lái)評(píng)估連接點(diǎn)處的運(yùn)行時(shí)對(duì)象的實(shí)際類型,而不僅僅是靜態(tài)類型。Identifier在運(yùn)行時(shí)動(dòng)態(tài)地賦予合適的對(duì)象。
一. 捕獲何時(shí)this引用一個(gè)特定的類型問(wèn)題
使用this([Type | Identifier])切入點(diǎn)。this([Type | Identifier])切入點(diǎn)的語(yǔ)法如下:
point <pointcut name>(<any values to be picked up>):this(<type> or <identifier> or *);
this([Type | Identifier])切入點(diǎn)檢查捕獲的連接點(diǎn)處的this引用,以決定是否調(diào)用關(guān)聯(lián)的通知,它具有5個(gè)關(guān)鍵特征:
1. 當(dāng)執(zhí)行對(duì)象是指定的類型時(shí),this([Type | Identifier])切入點(diǎn)會(huì)捕獲所有連接點(diǎn)。
2. Type定義參數(shù)必須解析成有效的類。它不同于TypePattern,TypePattern中可能使用通配符。
3. Identifier用于檢查this引用的運(yùn)行時(shí)對(duì)象的類型,以及根據(jù)需要把那個(gè)對(duì)象展示給通知。
4. 使用*通配符允許指定一個(gè)有效的對(duì)象,連接點(diǎn)處的this引用必須指向它,但是你對(duì)它是什么類型不感興趣。
5. 出現(xiàn)在異常處理上的連接點(diǎn)不具有使用handler(TypePattern)切入點(diǎn)的值,當(dāng)他們使用任何靜態(tài)代碼塊(包含使用staticinitialization(TypePattern)切入點(diǎn)指定的靜態(tài)類初始化)內(nèi)的handler(TypePattern),并且有趣地使用preinitializations(Signature)切入點(diǎn)預(yù)初始化對(duì)象時(shí),它們將不具有使用this([Type|Identifier])切入點(diǎn)展示this引用的值。
以下展示了this([Type | Identifier])切入點(diǎn)的兩個(gè)示例:
1.當(dāng)this引用指向MyClass類型的對(duì)象時(shí),使用Identifier捕獲連接點(diǎn)
2.當(dāng)this引用的類型是AnotherClass時(shí),使用Type指示捕獲












































二. 捕獲何時(shí)連接點(diǎn)的目標(biāo)對(duì)象是特定的類型
使用target([Type|Identifier])切入點(diǎn)。target([Type|Identifier])切入點(diǎn)的語(yǔ)法如下:
pointcut <pointcut name>(<any values to be picked up>) : target(<type> or <identifier> or *);
target([Type|Identifier])切入點(diǎn)具有5個(gè)關(guān)鍵特征:
1.當(dāng)目標(biāo)對(duì)象是特定的類型時(shí),target([Type|Identifier])切入點(diǎn)將選擇所有的連接點(diǎn)。
2.Type定義參數(shù)必須解析成有效的類,以選擇相關(guān)的連接點(diǎn)。它有別與TypePattern,TypePattern中可能使用通配符。
3.Identifier用于檢查在捕捉的連接點(diǎn)處被引用為目標(biāo)的運(yùn)行時(shí)對(duì)象的類型,并根據(jù)需要把那個(gè)對(duì)象展示給通知。
4.使用*通配符允許指定連接點(diǎn)必須有一個(gè)目標(biāo),但是你對(duì)它類型是什么不感興趣。
5.在使用handler(TypePattern)切入點(diǎn)的異常處理上,使用staticinitialization(TypePattern)的靜態(tài)類初始化,以及有趣地使用preinitialization(Signature)的對(duì)象初始化上,在這些地方出現(xiàn)的連接點(diǎn)不具有使用target([Type|Identifier])切入點(diǎn)進(jìn)行展示的任何目標(biāo)環(huán)境。
以下顯示了target([Type|Identifier])的兩個(gè)示例:
1.當(dāng)目標(biāo)是Identifier指定的MyClass對(duì)象時(shí),捕獲連接點(diǎn)
2.當(dāng)方法調(diào)用目標(biāo)的類型是Type指定的AnotherClass時(shí),捕獲連接點(diǎn)












































三. 捕獲何時(shí)連接點(diǎn)的參數(shù)是某個(gè)數(shù)字、類型和次序
使用args([Types|Identifiers])切入點(diǎn)。這個(gè)切入點(diǎn)的語(yǔ)法如下:
pointcut <pointcut name>(<any value to be picked up>):args(<types> or <identifiers> | .. | *,<repeat>);
args([Types|Identifiers])切入點(diǎn)具有8個(gè)關(guān)鍵特征:
1.可以使用Types和Identifiers的任意組合來(lái)搜索到適當(dāng)?shù)倪B接點(diǎn)上,并把適當(dāng)?shù)沫h(huán)境展示給通知。
2.Identifier用于檢查運(yùn)行時(shí)對(duì)象的類型,它們是捕捉的連接點(diǎn)處的參數(shù),以及根據(jù)需要把這些對(duì)象展示給通知。
3.使用..允許在一定程度上靈活地選擇特定連接點(diǎn)處的參數(shù)數(shù)量,它們必須與args([Type|Identifier])聲明匹配。
4.如果不使用..,args([Type|Identifier])切入點(diǎn)就會(huì)選擇與指定的類型精確匹配的所有連接點(diǎn)。這就是說(shuō):切入點(diǎn)只與在運(yùn)行時(shí)其參數(shù)具有相同次序、數(shù)量和類型的方法上的連接點(diǎn)匹配。
如果使用..,切入點(diǎn)就會(huì)使用“最佳適配”策略。這意味著語(yǔ)句args(MyClass,..,float)將導(dǎo)致任何匹配的連接點(diǎn)都具有兩個(gè)參數(shù),它開(kāi)始于一個(gè)MyClass對(duì)象,其后接著任意數(shù)量的參數(shù),他們中間包括一個(gè)浮點(diǎn)數(shù)。
5.在單個(gè)args([Type|Identifier])聲明中只能使用一個(gè)..。
6.使用*通配符允許在參數(shù)的類型方面表現(xiàn)處一定的靈活性,但是連接點(diǎn)的參數(shù)數(shù)量必須匹配。
例如,如果在args([Type|Identifier])切入點(diǎn)聲明中指定單個(gè)*,args(*),那么這個(gè)切入點(diǎn)將與具有一個(gè)任意類型參數(shù)的任何連接點(diǎn)匹配,并且會(huì)忽略沒(méi)有參數(shù)的任何連接點(diǎn)。類似地,語(yǔ)句args(*,*)將匹配包含兩個(gè)任意類型參數(shù)的任何連接點(diǎn)。
7. 出現(xiàn)在字段訪問(wèn)中的連接點(diǎn)(通過(guò)get(TypePattern)切入點(diǎn)或set(TypePattern)切入點(diǎn)捕獲)或者出現(xiàn)在靜態(tài)類初始化中的連接點(diǎn)(通過(guò)staticinitialization(TypePattern)切入點(diǎn)捕獲)沒(méi)有要使用args([Types|Identifiers])切入點(diǎn)展示的任何參數(shù)。
8. 如果把Object用作要被args([Types|Identifiers])切入點(diǎn)選擇的標(biāo)識(shí)符的類型,那么這將成功地匹配基本類型以及特定的Object實(shí)例。基本類型會(huì)自動(dòng)“裝箱”進(jìn)其對(duì)應(yīng)的對(duì)象類型中,例如,在把float基本類型傳遞給通知前,會(huì)將其“裝箱”進(jìn)Float中。這種行為提供了一種方法,可以通過(guò)它把基本參數(shù)值帶到通知中。
以下顯示了args([Types|Identifiers])的兩個(gè)示例
1.當(dāng)方法的參數(shù)是Identifier指定的MyClass對(duì)象時(shí),捕獲所有連接點(diǎn)
2.當(dāng)參數(shù)的類型是Type指定的AnotherClass時(shí),捕獲連接點(diǎn)












































posted on 2008-08-25 15:11 Brian 閱讀(291) 評(píng)論(0) 編輯 收藏 所屬分類: 《AspectJ Cookbook》讀書(shū)筆記