分類  >  WEB開發>ASP >

跟小弟我學aspectj之七 - call,execution,within,withincode

tags:    時間:2013-12-12 23:24:47
跟我學aspectj之七 ----- call,execution,within,withincode

本節開始,我們將詳細介紹pointcut的語法

一、call和execution

   語法結構:execution([修飾符] 返回值類型 方法名(參數) [異常模式])  藍色表示可選部分。

   例子:

  • execution(public *.*(..))  所有的public方法。
  • execution(* hello(..)) 所有的hello()方法
  • execution(String hello(..)) 所有返回值為String的hello方法。
  • execution(* hello(String))   所有參數為String類型的hello()
  • execution(* hello(String..)) 至少有一個參數,且第一個參數類型為String的hello方法
  • execution(* com.aspect..*(..))  所有com.aspect包,以及子孫包下的所有方法
  • execution(* com..*.*Dao.find*(..))  com包下的所有一Dao結尾的類的一find開頭的方法   

    上面的幾個例子,包括了修飾符,返回值,方法名,以及參數。大家可以根據需要靈活運用。接下來講講call 和 execution的區別,從字面理解:call為調用,而execution為執行。  事實上他們的區別也確實如此。

 

    call捕獲的joinpoint是簽名方法的調用點,而execution捕獲的則是執行點。為了有說服力,我寫了一個demo.代碼如下:

 

 

 


我們攔截了參數為:int的main方法。 這裡用到了一內置的對象:thisJoinPoint,他表示當前jionPoint. 跟我們在java中的this 其實是差不多的,如果你不明白,那麼你多運行一下,好好體會一下。getSourceLocation()表示元代嗎的位置:   我們運行一下HelloWorld.java。 結果如下:

 

 

 

14是行號,即:main(5);

 

接下來,我們把HelloAspect中的call改為execution。發現列印結果如下:

 

 

在比照一下代碼,看下輸出。  現在明白了吧??   一個是調用的地方,一個是執行的地方。

 

 thisJoinPoint.getSourceLocation() 這段代碼將會在我們以後的Demo中經常用到。這是一個跟蹤調試的好辦法。

 

二、within 和 withincode

 

   現在假設你還有另外一個class,他也包含main()方法。

 

 

  我們的HelloAspect如下:

 

 

這樣,便會把HelloAspectDemo的main方法捕獲到,  現在leader說: HelloAspectDemo不需要捕獲。那我們怎麼辦勒?你首先想到的肯定是修改pointcut,指定到我們的HelloWorld類。 這當然是可以的,假設:現在還有5個類,也有main方法,也需要攔截。那你這解決辦法肯定就不行了。(當然你也可以用 || 來組合他們)。這個時候就用到了我們的within了。 修改一下HelloAspect

 

 

 

  再運行一下HelloAspectDemo,你會發現他被排除了,也就是說他沒有被攔截到。  

  withincode與within相似,不過withcode()接受的signature是方法,而不是類。用法,意思都差不多,只不過是使用場合不同。

 

 

  在接下來的一章,我將給大家介紹aspectj中最難理解的一個概念:控制流(cfow() cfowbelow())。

推薦閱讀文章

Bookmark the permalink ,來源:互聯網