How to intercept static property in java class using AspectJ?

In the following code snippet, I need to execute some logic whenever I access a property myList. Is it possible?

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();
    }
}
+4
source share
2 answers

You can sew the code Before/ After/ Aroundany access to your field using the following items:

@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(){}
}

in .aj syntax, it might look like this:

public aspect TestAccessorsAspect {

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

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

Whenever this field is readable (respectively spelled), these pointcut trigger.

+1
source

, , . , , .

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

Source: https://habr.com/ru/post/1654021/


All Articles