最愛Java

          書山有路勤為徑,學(xué)海無涯苦作舟

          《AspectJ Cookbook》讀書筆記八: 捕獲屬性上的連接點(diǎn)

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

          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關(guān)鍵字定義一個常量屬性,這樣,在訪問這個常量時你就可能使用get(Signature)切入點(diǎn)來捕獲。
              

          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()部分中帶有一個標(biāo)識符,用于包含訪問過的值。

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

          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(
          "-----------------------------------------");        
              }

          }

           

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

          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》讀書筆記

          公告


          導(dǎo)航

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

          統(tǒng)計

          常用鏈接

          留言簿(4)

          隨筆分類

          隨筆檔案

          收藏夾

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 辽源市| 庄浪县| 镇原县| 尚志市| 宜兰市| 宁南县| 稻城县| 呼伦贝尔市| 运城市| 会昌县| 随州市| 丰原市| 麦盖提县| 米脂县| 肇庆市| 开平市| 安溪县| 盱眙县| 伽师县| 东安县| 科尔| 泸溪县| 东台市| 安义县| 三原县| 济南市| 忻城县| 锦州市| 宁陵县| 曲麻莱县| 梁山县| 河池市| 黑水县| 雅江县| 永州市| 盱眙县| 玛沁县| 门源| 曲松县| 锡林郭勒盟| 如东县|