execution表達式


execution(<修飾符模式>?<返回類型模式><方法名模式>(<參數模式>)<異常模式>?) 

 

除了返回類型模式、方法名模式和參數模式外,其它項都是可選的。

一、通過方法簽名定義切點

 execution(public * *(..))

  匹配所有目標類的public方法,但不匹配SmartSeller和protected voidshowGoods()方法。第一個*代表返回類型,第二個*代表方法名,而..代表任意入參的方法;

 execution(* *To(..))

  匹配目標類所有以To為后綴的方法。它匹配NaiveWaiter和NaughtyWaiter的greetTo()和serveTo()方法。第一個*代表返回類型,而*To代表任意以To為后綴的方法;

二、通過類定義切點

 execution(*com.baobaotao.Waiter.*(..))

  匹配Waiter接口的所有方法,它匹配NaiveWaiter和NaughtyWaiter類的greetTo()和serveTo()方法。第一個*代表返回任意類型,com.baobaotao.Waiter.*代表Waiter接口中的所有方法;

 execution(*com.baobaotao.Waiter+.*(..))

  匹配Waiter接口及其所有實現類的方法,它不但匹配NaiveWaiter和NaughtyWaiter類的greetTo()和serveTo()這兩個Waiter接口定義的方法,同時還匹配NaiveWaiter#smile()和NaughtyWaiter#joke()這兩個不在Waiter接口中定義的方法。

三、通過類包定義切點

  在類名模式串中,".*"表示包下的所有類,而"..*"表示包、子孫包下的所有類。

 execution(* com.baobaotao.*(..))l

  匹配com.baobaotao包下所有類的所有方法;

 execution(* com.baobaotao..*(..))l

  匹配com.baobaotao包、子孫包下所有類的所有方法,如com.baobaotao.dao,com.baobaotao.servier以及com.baobaotao.dao.user包下的所有類的所有方法都匹配。".."出現在類名中時,后面必須跟"*",表示包、子孫包下的所有類;   

 execution(* com..*.*Dao.find*(..))

  匹配包名前綴為com的任何包下類名后綴為Dao的方法,方法名必須以find為前綴。如com.baobaotao.UserDao#findByUserId()、com.baobaotao.dao.ForumDao#findById()的方法都匹配切點。

四、通過方法入參定義切點

  切點表達式中方法入參部分比較復雜,可以使用"*"和".."通配符,其中"*"表示任意類型的參數,而".."表示任意類型參數且參數個數不限。 

 execution(* joke(String,int)))

  匹配joke(String,int)方法,且joke()方法的第一個入參是String,第二個入參是int。它匹配NaughtyWaiter#joke(String,int)方法。如果方法中的入參類型是Java.lang包下的類,可以直接使用類名,否則必須使用全限定類名,如joke(java.util.List,int);

 execution(* joke(String,*)))

  匹配目標類中的joke()方法,該方法第一個入參為String,第二個入參可以是任意類型,如joke(Strings1,String s2)和joke(String s1,double d2)都匹配,但joke(String s1,doubled2,String s3)則不匹配;

 execution(* joke(String,..)))

  匹配目標類中的joke()方法,該方法第 一個入參為String,后面可以有任意個入參且入參類型不限,如joke(Strings1)、joke(String s1,String s2)和joke(String s1,double d2,Strings3)都匹配。

 execution(* joke(Object+)))

  匹配目標類中的joke()方法,方法擁有一個入參,且入參是Object類型或該類的子類。它匹配joke(Strings1)和joke(Client c)。如果我們定義的切點是execution(*joke(Object)),則只匹配joke(Object object)而不匹配joke(Stringcc)或joke(Client c)。

五、args()和@args()

  args()函數的入參是類名,@args()函數的入參必須是注解類的類名。雖然args()允許在類名后使用+通配符后綴,但該通配符在此處沒有意義:添加和不添加效果都一樣。

1、args()

  該函數接受一個類名,表示目標類方法入參對象按類型匹配於指定類時,切點匹配,如下面的例子:

args(com.baobaotao.Waiter)

  表示運行時入參是Waiter類型的方法,它和execution(**(com.baobaotao.Waiter))區別在於后者是針對類方法的簽名而言的,而前者則針對運行時的入參類型而言。如args(com.baobaotao.Waiter)既匹配於addWaiter(Waiterwaiter),也匹配於addNaiveWaiter(NaiveWaiter naiveWaiter),而execution(**(com.baobaotao.Waiter))只匹配addWaiter(Waiterwaiter)方法;實際上,args(com.baobaotao.Waiter)等價於execution(**(com.baobaotao.Waiter+)),當然也等價於args(com.baobaotao.Waiter+)。

2、@args()

  該函數接受一個注解類的類名,當方法的運行時入參對象標注發指定的注解時,方法匹配切點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM