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