邊城愚人

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

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            31 隨筆 :: 0 文章 :: 96 評論 :: 0 Trackbacks

          ??? ??? target 切入點格式如下: target ([ Type Identifier ])。 Type 指示對連接點處的對象類型提供一個靜態編譯時評估,并采用完全限定類名的形式(也就是說, Type 不能是使用通配符的類型聲明模式)。 Identifier 提供了一種方法,可通過它來評估連節點處的運行時對象的實際類型,而不僅僅是靜態類型。 Identifier 在運行時動態地賦予合適的對象。

          ??? ??? 下面通過例子說明一下 target 的使用:

          public interface Animal {

          ??? void speak();

          }


          public class Cat implements Animal{

          ??? public void speak() {

          ??? ??? System. out .println( " 喵喵 " );

          ??? }

          }


          public class Dog implements Animal{

          ??? public void speak() {

          ??? ??? System. out .println( " 汪汪 " );

          ??? }

          }

          public class Zoo {

          ??? private List<Animal> animals = new ArrayList<Animal>();

          ??? public void addAnimal(Animal a){

          ??? ??? animals .add(a);

          ??? }

          ??? public void speak(){

          ??? ??? for (Animal a : animals ){

          ??? ??? ??? ??? a.speak();

          ??? ??? }

          ??? }

          }

          ???

          定義一個切入點如下:

          public pointcut speakCallOne():

          ??? call (* speak()) && target (Animal);

          ??? ??? 雖然 pointcut speakCallOne() 中的 call (* speak()) 匹配所有類的 speak() 方法(這里匹配 Cat 、 Dog 、 Zoo ),但 target (Animal) 便將 pointcut speakCallOne() 限定在 Animal 及其子類(也就是 Cat 、 Dog ,而不包含 Zoo )。這里當然可以使用 call (* Animal.speak()) 來代替 target 。和靜態的類型聲明不同, target 并不能靜態地確定的每一個連接點,因為匹配是基于運行時的類型信息。在使用 AJDT 的情況下,可以看到 target 和靜態的類型聲明的不同:

          ??? ?? 1)使用靜態的類型聲明的圖示:

          Screenshot3.png


          Screenshot4.png


          ??? ?? 可以看到,在方面AspectDemo中,before通知的左面有一個向上的小箭頭表示其為通知,而Zoo中的void speak()方法中a.speak();一行的左面有個向右的小箭頭,表明其匹配了一個通知(也就是AspectDemo中的before通知)。
          ??? ?? 2)
          使用target的圖示:

          Screenshot1.png

          Screenshot2.png

          ??? ?? 和靜態的類型聲明不同,使用了target的before前的箭頭上有個問號,以表明target動態的不確定性。而Zoo的main中調用的方法z.speak()前有個類似于speak()中的a.speak();的箭頭,不同的是,z.speak()前的箭頭上有個問號,這表明此處speak()并不確定是否匹配通知(因為target是動態確定連接點)。而實際上情況是,z.speak()確實不是通知的連接點。

          ??? ??? 對于targetIdentifier)的使用,示例如下:

          ??? publicpointcut speakCallTwo(Object o):

          ??? ??? call(* Animal.speak()) && target(o);

          ??? ??? before(Object o):speakCallTwo(o){

          ??? ??? ??? ??? System.out.println(o.getClass());

          ??? ??? }

          ??? }

          ??? ??? 通過將 target付給 Object o,可以在before通知中調用 o的一些操作。

          ??? ??? thistarget指示符的一個補充,它的格式與target相同。在含義上,this表示切入點所匹配的方法的調用類,而target表示匹配方法的目標類。例如:

          ??? ??? publicpointcut anotherSpeakCall():

          ??? ??? ??? call(* speak()) && target(Animal) && this(Zoo);

          ??? ??? target(Animal) 表示void speak()方法是Animal及子類的,它不會匹配 Zoovoid speak()方法。而this(Zoo)會匹配調用了Animal及子類的void speak()方法的 Zoo類的方法,這里就是Zoovoid speak()方法。

          ??? ??? 如上便是關于targetthis的基本用法。該文參考了《Eclipse AspectJ》和《AspectJ cookbook》。

          posted on 2007-07-09 09:17 kafka0102 閱讀(2714) 評論(3)  編輯  收藏 所屬分類: AOP

          評論

          # re: AspectJ學習(2)使用切入點 target和this 2008-05-09 08:32 davide520
          謝謝博主.  回復  更多評論
            

          # re: AspectJ學習(2)使用切入點 target和this[未登錄] 2008-11-01 09:42 piggy
          不錯,受益了.  回復  更多評論
            

          # re: AspectJ學習(2)使用切入點 target和this[未登錄] 2011-03-16 13:12 max
          target() and this() work only for non-static methods  回復  更多評論
            

          主站蜘蛛池模板: 兰州市| 平顶山市| 苍溪县| 城步| 白玉县| 万安县| 蒙自县| 鹤壁市| 桑植县| 鄂托克前旗| 平谷区| 陆良县| 波密县| 华蓥市| 岳阳县| 南昌市| 建阳市| 奉化市| 思茅市| 巴东县| 南京市| 大埔区| 南江县| 开鲁县| 六枝特区| 天等县| 黄山市| 巫溪县| 呼和浩特市| 隆昌县| 博乐市| 阜南县| 绵阳市| 昭苏县| 鄂托克前旗| 天门市| 普宁市| 宣恩县| 茂名市| 沈丘县| 永新县|