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

How to intercept a static property in java class using AspectJ?

在下面的代码片段中,我需要在访问 属性 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();
    }
}

您可以使用以下切入点编织代码 Before/After/Around 对您的字段的任何访问:

@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);   
}

每当访问这些字段以进行读取(resp. 写入)时,就会触发这些切入点。

你的问题很简单,不知道我是否理解。根据你所说的,一个非常小的调整就可以解决这个问题。

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

    public static void addData() {
        myListAccessLogic();
        myList.add("foo");

        myListAccessLogic();
        myList.add("bar");
    }
    public static void removeData() {
        myListAccessLogic();
        if(myList.size() > 0) {

            myListAccessLogic();
            myList.remove(0);
        }
    }
    public static void displayData() {
        myListAccessLogic();
        for (String data : myList) {

            myListAccessLogic();
            System.out.println("data : "+data);
        }
    }

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