最愛Java

          書山有路勤為徑,學海無涯苦作舟

          《AspectJ Cookbook》讀書筆記七: 捕獲類和對象構造上的連接點

          一.  捕獲對構造函數的調用
              使用Call(Signature)寫入點,它帶有額外的new關鍵字作為簽名的一部分。使用與構造函數有關的call(Signature)切入點的語法如下:
              pointcut <pointcut name>(<any values to be picked up>): call(<optional modifier> <class>.new(<parameter types>));

              在用于捕獲對構造函數的調用時,call(Signature)切入點具有3個關鍵特征:
              1.在把一個類實例化成一個對象時,具有new關鍵字的call(Signature)切入點會捕獲連接點。
              2.通過使用around()形式的通知,call(Signature)寫入點可以在Java的正常繼承規則的限制下重寫返回對象的類型。
              3.編譯器不會檢查指定的Signature是否對應于實際的構造函數。

           

          package com.aspectj;

          public aspect CallNewRecipe {
              
          /*
               * Specifies calling advice when any constructor is called
               * that meets the following signature rules:
               * 
               * Class Name:MyClass
               * Method Name:new (This is a keyword indicating the constructor call)
               * Method Parameters: int , String
               
          */

              pointcut myClassConstructorWithIntAndStringPointcut() : call(MyClass.
          new(int , String));
              
              
          //Advice declaration
              before() : myClassConstructorWithIntAndStringPointcut() {
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by myClassConstructorWithIntAndOthersPointcut()");
                  System.out.println(
          "The current type of object under construction is:");
                  System.out.println(thisJoinPoint.getThis());
                  System.out.println(
          "Signature: " + thisJoinPoint.getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getSourceLocation());
                  System.out.println(
          "-----------------------------------------");
              }

          }



          二. 在執行構造函數時捕獲它
              使用execution(Signature)切入點,它帶有額外的new關鍵字作為簽名的一部分。使用與構造函數有關的execution(Signature)切入點的語法如下:
              pointcut <pointcut name>(<any values to be picked up>):execution(<optional modifier> <class>.new<parameter types>));

              在用于捕獲構造函數的執行時,execution(Signature)切入點具有3個關鍵特征:
              1.在執行類的構造函數時,具有new關鍵字的execution(Signature)切入點會觸發連接點。
              2.不能在調用類的構造函數之前那一刻觸發連接點。這會阻止重寫返回的對象。
              3.可以使用around()通知來重寫構造函數方法的實現,當不能重寫正在構造的對象的類型。


          package com.aspectj;

          public aspect ExecutionNewRecipe {
              
          /*
               * Specifies calling advice when any constructor executes
               * that meets the following signature rules:
               * 
               * Class Name:MyClass
               * Method Name:new (This is a keyword indicating the constructor call)
               * Method Parameters: int , String
               
          */

              pointcut myClassConstructorWithIntAndStringPointcut() : execution(MyClass.
          new(int,String));
              
              
          //Advice declaration
              before() : myClassConstructorWithIntAndStringPointcut() {
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by myClassConstructorWithIntAndOthersPointcut()");
                  System.out.println(
          "The current type of object under construction is:");
                  System.out.println(thisJoinPoint.getThis().getClass());
                  System.out.println(
          "Signature: " + thisJoinPoint.getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getSourceLocation());
                  System.out.println(
          "-----------------------------------------");        
              }

          }


          三. 捕獲何時初始化對象
              使用initialization(Signature)切入點。initialization(Signature)切入點的語法如下:
              pointcut <pointcut name>(<any values to be picked up>):initialization(<optional modifier> <class>.new<parameter types>));

              initialization(Signature)切入點具有5個關鍵特征:
              1.initialization(Signature)切入點必須包含new關鍵字。
              2.initialization(Signature)切入點捕獲連接點發生在任何超類的初始化之后,以及從構造函數方法返回之前。
              3.Signature必須解析成特定類的構造函數,而不是一個簡單的方法。
              4.initialization(Signature)切入點提供了編譯時的檢查,用于檢查構造函數是否正在被引用。
              5.由于AspectJ編譯器中的編譯器限制,當與around()通知關聯時,不能使用initialization(Signature)切入點。

           

          package com.aspectj;


          public aspect InitializationRecipe {
              
          /*
               * Specifies calling advice when any object
               * initializes using a constructor
               * that meets the following signature rules:
               * 
               * Class Name:MyClass
               * Method Name:new (This is a keyword indicating the constructor call)
               * Method Parameters: int and any others
               
          */

              pointcut myClassObjectInitializationWithIntAndStringPointcut() : execution(MyClass.
          new(int,*));
              
              
          //Advice declaration
              before() : myClassObjectInitializationWithIntAndStringPointcut() {
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by myClassObjectInitializationWithIntAndStringPointcut()");
                  System.out.println(
          "The current type of object under construction is:");
                  System.out.println(thisJoinPoint.getThis().getClass());
                  System.out.println(
          "Signature: " + thisJoinPoint.getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getSourceLocation());
                  System.out.println(
          "-----------------------------------------");        
              }

          }



          四. 捕獲何時將要初始化一個對象
              使用preinitialization(Signature)切入點。preinitialization(Signature)切入點的語法如下:
              pointcut <pointcut name>(<any values to be picked up>):preinitialization(<optional modifier> <class>.new<parameter types>));

              preinitialization(Signature)切入點具有5個關鍵特征:
              1.preinitialization(Signature)切入點必須包含new關鍵字。
              2.preinitialization(Signature)切入點捕獲連接點發生在進入捕獲構造函數之后,以及調用任何超類構造函數之前。
              3.Signature必須解析成一個構造函數。
              4.preinitialization(Signature)切入點提供了編譯時的檢查,用于檢查構造函數是否正在被引用。
              5.由于AspectJ編譯器中的編譯器限制,當與around()通知關聯時,不能使用preinitialization(Signature)切入點。

           

          package com.aspectj;

          public aspect PreInitializationRecipe {
              
          /*
               * Specifies calling advice just before an object initializes
               * using a constructor that meets the following signature rules:
               * 
               * Class Name:MyClass
               * Method Name:new (This is a keyword indicating the constructor call)
               * Method Parameters: an int followed by a String
               
          */

              pointcut myClassIntStringObjectPreInitializationPointcut() : preinitialization(MyClass.
          new(int,String));
              
              
          //Advice declaration
              before(int number , String name) : myClassIntStringObjectPreInitializationPointcut() && args(number , name) {
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by anyMyClassObjectInitializationPointcut()");
                  System.out.println(
          "The current type of object under construction is:");
                  System.out.println(thisJoinPoint.getThis());
                  System.out.println(
          "The values passed in where: " + number + " , " + name);
                  System.out.println(
          "Signature: " + thisJoinPoint.getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getSourceLocation());
                  System.out.println(
          "-----------------------------------------");        
              }

          }



          五. 捕獲何時初始化類
              使用staticinitialization(TypePattern)寫入點。staticinitialization(TypePattern)寫入點的語法如下:
              pointcut <pointcout name>(<any values to be picked up>) : staticinitialization(<class>);

              staticinitialization(TypePattern)切入點具有兩個關鍵特征:
              1.對可供staticinitialization(TypePattern)切入點所選通知使用的環境有一些限制。沒有父對象觸發靜態初始化;因此,沒有this引用。也不涉及實例對象,因此,沒有目標引用。
              2.TypePattern可以包含通配符,用于選擇一系列不同的類。

          package com.aspectj;

          public aspect StaticinitializationRecipe {
              
          /*
               * Specifies calling advice when a class is initialized
               * that meets the following type pattern rules:
               * 
               * Class Name:MyClass
               
          */

              pointcut myClassStaticInitializationPointcut() : staticinitialization(MyClass);
              
              
          //Advice declaration
              before() : myClassStaticInitializationPointcut() {
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by myClassStaticInitializationPointcut()");
                  System.out.println(
          "Join Point Kind: ");
                  System.out.println(thisJoinPoint.getStaticPart().getKind());
                  System.out.println(
          "Signature: " + thisJoinPoint.getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getSourceLocation());
                  System.out.println(
          "-----------------------------------------");        
              }

          }

          posted on 2008-08-22 10:32 Brian 閱讀(1236) 評論(0)  編輯  收藏 所屬分類: 《AspectJ Cookbook》讀書筆記

          公告


          導航

          <2008年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統計

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 双城市| 敦煌市| 酒泉市| 雷波县| 孝昌县| 广汉市| 衡阳县| 镇雄县| 庄浪县| 内黄县| 温州市| 健康| 通渭县| 城口县| 潞城市| 永平县| 阿拉善右旗| 五河县| 迁西县| 六盘水市| 齐齐哈尔市| 长寿区| 乐亭县| 交城县| 松阳县| 舒城县| 武宁县| 当阳市| 菏泽市| 和平县| 枣阳市| 望城县| 湘潭县| 余干县| 原平市| 湟源县| 南澳县| 梅河口市| 丹东市| 马关县| 崇明县|