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