Search code examples
javastaticaopaspectj

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


In the following code snippet I need to execute some logic whenever the property myList is accessed. 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();
    }
}

Solution

  • You can weave code Before/After/Around any access to your field using the following pointcuts :

    @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, this 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 those field are accessed for reading (resp. writing), those pointcuts are going to be triggered.