最愛Java

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

          《AspectJ Cookbook》讀書筆記八: 捕獲屬性上的連接點

          一. 捕獲何時訪問對象的屬性
              使用get(Signature)切入點。get(Signature)切入點的語法如下:
              pointcut <pointcut name>(<any values to be picked up>) : get(<optional modifier> <type> <class>.<field>);
              get(Signature)具有4個關鍵特征:
              1.get(Signature)切入點會觸發直接在其中(而不僅僅是在訪問器方法的調用上)訪問屬性的通知。
              2.get(Signature)切入點不能捕獲對靜態屬性的訪問,盡管從AspectJ的語法角度講以這種方式定義切入點是完全合法的。
              3.Signature必須解析成特定類的屬性。
              4.Signature可以包含通配符,用于選擇不同屬性上的一系列連接點。

          package com.aspectj;

          public aspect GetRecipe {
              
          /**
               * Specifies calling advice whenever an attribute matching the following rules
               * is accessed:
               * 
               * Type:String 
               * Class Name:MyClass 
               * Attribute Name:name
               
          */

              pointcut getNamePointcut(): get(String MyClass.name);
              
              
          // Advice declaration
              before():getNamePointcut() {
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by getNamePointcut()");
                  System.out.println(
          "Signature: " + thisJoinPoint.getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getSourceLocation());
                  System.out.println(
          "-----------------------------------------");
              }

          }

              你可能期待類使用static和final關鍵字定義一個常量屬性,這樣,在訪問這個常量時你就可能使用get(Signature)切入點來捕獲。
              

          package com.aspectj;

          public aspect GetConstant {
              
          /**
               * Specifies calling advice whenever an attribute matching the following rules
               * is accessed:
               * 
               * Type:String 
               * Class Name:MyClass 
               * Attribute Name:CONSTANT
               
          */

              pointcut getConstantPointcut():get(
          public static final String MyClass.CONSTANT);
              
              
          //Advice declaration
              before():getConstantPointcut() {
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by getConstantPointcut()");
                  System.out.println(
          "Signature: " + thisJoinPoint.getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getSourceLocation());
                  System.out.println(
          "-----------------------------------------");        
              }

          }

           

          二. 捕獲訪問的字段值
              使用after returning(<ReturnValue>)形式的通知。它在聲明的returning()部分中帶有一個標識符,用于包含訪問過的值。

          package com.aspectj;

          public aspect CaptureAccessedFieldValue {
              pointcut getNamePointcut() : get(String MyClass.name);
              
              
          //Advice declaration
              after() returning(String value) : getNamePointcut() {
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by getNamePointcut()");
                  System.out.println(
          "Signature: " + thisJoinPoint.getStaticPart().getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getStaticPart().getSourceLocation());
                  System.out.println(
          "-----------------------------------------");        
              }

          }


          三. 捕獲何時修改對象的字段
              使用set(Signature)切入點。set(Signature)切入點的語法如下:
              pointcut <pointcut name>(<any values to be picked up>) : set(<optional modifier> <type> <class>.<field>);
              
              set(Signature)具有4個關鍵特征:
              1.set(Signature)切入點在修改字段時觸發。
              2.set(Signature)切入點不能捕獲對靜態字段的修改,盡管從AspectJ的語法角度講以這種方式定義切入點是完全合法的。
              3.Signature必須解析成特定類的屬性。
              4.Signature可以包含通配符,用于選擇不同屬性上的一系列連接點。

          package com.aspectj;

          public aspect SetRecipe {
              
          /*
               * Specifies calling advice whenever an attribute
               * matching the following rules is modified:
               * 
               * Type: String
               * Class Name: MyClass
               * Attribute: name
               
          */

              pointcut setNamePointcut() :set(String MyClass.name);
              
              
          //Advice declaration
              before():setNamePointcut() && !within(SetRecipe+{
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by setNamePointcut()");
                  System.out.println(
          "Signature: " + thisJoinPoint.getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getSourceLocation());
                  System.out.println(
          "-----------------------------------------");        
              }

          }

           

          四. 在修改字段時捕獲它的值
              結合使用args([Types | Identifiers])切入點和set(Signature)切入點,展示字段的新值,該字段被設置成切入點上的標識符,可將其傳遞給相應的通知。

          package com.aspectj;

          public aspect CaptureModifiedFieldValue {
              pointcut setNamePointcut(String newValue):set(String MyClass.name) 
          && args(newValue);
              
              
          //Advice declaration
              before(String newValue) : setNamePointcut(newValue) {
                  System.out.println(
          "---------- Aspect Advice Logic ----------");
                  System.out.println(
          "In the advice picked by setNamePointcut()");
                  System.out.println(
          "Signature: " + thisJoinPoint.getSignature());
                  System.out.println(
          "Source Line: " + thisJoinPoint.getSourceLocation());
                  System.out.println(
          "-----------------------------------------");                
              }

          }

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

          公告


          導航

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

          統計

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 滦南县| 沾益县| 普陀区| 白玉县| 区。| 漳平市| 昭通市| 勃利县| 福建省| 漠河县| 松阳县| 岳池县| 恭城| 安新县| 五河县| 杂多县| 格尔木市| 崇阳县| 桂林市| 祁东县| 恩平市| 垫江县| 峨边| 六安市| 筠连县| 博客| 台江县| 周口市| 墨竹工卡县| 拉萨市| 仙游县| 安阳市| 开远市| 淳化县| 偏关县| 禹城市| 巫溪县| 佛冈县| 英德市| 万年县| 增城市|