邊城愚人

          如果我不在邊城,我一定是在前往邊城的路上。

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            31 隨筆 :: 0 文章 :: 96 評(píng)論 :: 0 Trackbacks

          ??? ??? call execution 的指示符分別為 call Method-Signature )、 execution Method-Signature ),匹配方法簽名的方法或構(gòu)造函數(shù)的執(zhí)行。 對(duì)于 call 來(lái)說(shuō),調(diào)用的連接點(diǎn)位于方法調(diào)用點(diǎn)的調(diào)用代碼處;對(duì)于 execution 來(lái)說(shuō),執(zhí)行的連接點(diǎn)位于方法執(zhí)行的位置。也就是說(shuō), call execution 的重要區(qū)別在于它們傳遞了哪些類型給 AspectJ 編譯器以用來(lái)與 aspect 進(jìn)行鏈接。

          ??? ??? 通常,我們?cè)谑褂?/font> call execution 時(shí),從效果上來(lái)看并不會(huì)覺(jué)察出二者的區(qū)別。下面給出一個(gè)例子說(shuō)明 call execution 的運(yùn)行時(shí)機(jī)及區(qū)別。

          ??? ?

          public?class?A??{
          ????
          public?void?foo(){
          ????????System.out.println(
          "A.foo()");
          ????}
          }

          public?class?Main?{
          ????
          public?void?callFoo(A?a){
          ????????a.foo();
          ????}
          ????
          public?static?void?main(String[]?args)?{????
          ????????Main?m?
          =?new?Main();
          ????????m.callFoo(
          new?A());
          ????}
          }

          ??? ??? 1 )現(xiàn)在我看一下下面使用 call 的切面:

          ? ????????????????????? aspectj.png

          ???

          ??? ??? ?? 該切面定義了一個(gè)切入點(diǎn)callA(Object o,Object t),其中this(o)表示將匹配的連接點(diǎn)的對(duì)象賦給o,target(t)表示將匹配的連接點(diǎn)的目標(biāo)對(duì)象賦給t。輸出結(jié)果為:


          ??? ??? ?? aspectj-3.png

          ??? ?? ?

          ??? ??? 輸出表明,this的類(調(diào)用類)為Maintarget的類(目標(biāo)類)為A我們?cè)倏匆幌?/font>Main類:


          ??? ?? aspectj-2.png


          ??? ??? 在AJDT下,可以看到,call切入點(diǎn)匹配的位置在調(diào)用類(Main)的方法void callFoo(A a)中,而不是在目標(biāo)類A中。

          ??? ??? 2)再來(lái)看一下execution的例子:


          ??? ?? aspectj-4e.png


          ?? ?? aspectj-f.png


          ??? ??? 在這個(gè)方面中,切入點(diǎn)沒(méi)有使用thistarget,而是在before通知中使用了AspectJAPI達(dá)到同樣的效果??梢钥吹?,切入點(diǎn)executionA()匹配的連接點(diǎn)的位置在Afoo()方法,這和上面的call匹配的連接點(diǎn)的位置是不同的。

          ??? ?? aspectj-7t.png

          ?? ?

          ??? ??

          ??? ??? 從輸出可以看到,在execution中,thistarget指向同一個(gè)類。在call中,thistarget不是指向同一個(gè)類。

          ??? ??? executioncall還有一點(diǎn)很重要的區(qū)別。對(duì)于繼承類來(lái)說(shuō),如果它沒(méi)有覆蓋父類的方法,那么execution不會(huì)匹配子類中沒(méi)有覆蓋父類的方法。比如說(shuō)我們有一個(gè)類B繼承于A,但沒(méi)有覆蓋A類的foo(),那么對(duì)于B的實(shí)例的foo()方法,execution(* B.foo())將不會(huì)被匹配。

          ??? ??? 做個(gè)總結(jié),如果想跟蹤連接點(diǎn)的內(nèi)部代碼運(yùn)行情況可以考慮使用execution,但如果你只關(guān)心連接點(diǎn)的簽名(比如你使用第三方庫(kù)或是標(biāo)準(zhǔn)API),則使用call。

          ??? ??? 注:該文參考了《Eclipse AspectJ》和《AspectJ cookbook》。


          posted on 2007-07-12 09:50 kafka0102 閱讀(4166) 評(píng)論(6)  編輯  收藏 所屬分類: AOP

          評(píng)論

          # re: AspectJ學(xué)習(xí)(3)使用切入點(diǎn) call和execution 2008-04-27 10:53 wxyhibernate
          謝謝
            回復(fù)  更多評(píng)論
            

          # re: AspectJ學(xué)習(xí)(3)使用切入點(diǎn) call和execution 2008-08-16 11:05 xiaozhang206
          非常感謝,高手!  回復(fù)  更多評(píng)論
            

          # re: AspectJ學(xué)習(xí)(3)使用切入點(diǎn) call和execution[未登錄](méi) 2008-10-24 12:48 Java愛(ài)好者
          好文章,自己正在學(xué)習(xí)AspectJ,不過(guò)全是英文版!覺(jué)得有點(diǎn)迷惑,看了你的文章,有些東西,豁然開朗!  回復(fù)  更多評(píng)論
            

          # re: AspectJ學(xué)習(xí)(3)使用切入點(diǎn) call和execution 2009-07-08 14:31 sheng
          謝謝  回復(fù)  更多評(píng)論
            

          # re: AspectJ學(xué)習(xí)(3)使用切入點(diǎn) call和execution 2009-08-26 15:47 eva
          請(qǐng)問(wèn),call 可以攔截到 間接調(diào)用的方法嗎?
          例如 一個(gè)類里的A方法調(diào)用B 方法,可以攔截到B嗎?
          我現(xiàn)在遇到的問(wèn)題是不知道怎么攔截 間接方法調(diào)用  回復(fù)  更多評(píng)論
            

          # re: AspectJ學(xué)習(xí)(3)使用切入點(diǎn) call和execution 2010-11-17 17:15 可可
          相當(dāng)好的文章,博主要是把這個(gè)系列寫下去,必然是AspectJ的引路人啊

          謝謝博主  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 迁西县| 天津市| 台安县| 江山市| 子洲县| 迁安市| 将乐县| 星子县| 崇明县| 延川县| 高台县| 井陉县| 射洪县| 井研县| 阿拉善右旗| 乐昌市| 满洲里市| 遵化市| 商丘市| 错那县| 分宜县| 梅州市| 和田县| 寿阳县| 永兴县| 吉首市| 祥云县| 永和县| 鄂尔多斯市| 洪湖市| 九龙城区| 泰来县| 太原市| 延吉市| 沁水县| 遵化市| 华蓥市| 黄冈市| 招远市| 抚松县| 乌鲁木齐市|