如何使用AspectJ拦截java类中的静态属性?

在下面的代码片段中,每当访问属性myList时,我都需要执行一些逻辑.可能吗?

public class Test {
    public static List<String> myList = new ArrayList();

    public static void addData(){
        myList.add("foo");
        myList.add("bar");
    }
    public static void removeData(){
        if(myList.size() > 0){
            myList.remove(0);
        }
    }
    public static void displayData(){
        for (String data : myList) {
            System.out.println("data : "+data);
        }
    }

    public static void main(String[] args) {
        addData();
        displayData();
        removeData();
        displayData();
    }
}

解决方法:

您可以使用以下切入点编码代码前/后/周围对您的字段的任何访问:

@Aspect
public class TestAccessorsAspect {
    @Pointcut("get(java.util.List com.sample.Test.myList)")
    public void readMyList(){}

    @Pointcut("set(java.util.List com.sample.Test.myList)")
    public void writeMyList(){}
}

在.aj语法中,这可能如下所示:

public aspect TestAccessorsAspect {

    pointcut readMyList() : get(java.util.List com.sample.Test.myList);   

    pointcut writeMyList() : set(java.util.List com.sample.Test.myList);   
}

每当访问这些字段进行读取(分别写入)时,这些切入点将被触发.

上一篇:Spring AOP 使用介绍,从前世到今生


下一篇:java – AOP在Overrided方法上应用自定义注释