最爱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 阅读(1172) 评论(0)  编辑  收藏 所属分类: 《AspectJ Cookbook》读书笔记


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 

公告


导航

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

统计

常用链接

留言簿(4)

随笔分类

随笔档案

收藏夹

搜索

最新评论

阅读排行榜

评论排行榜