AspectJ可以将字段调用替换为getter / setter吗?

时间:2012-06-14 19:57:28

标签: java aspectj javassist

例如,我有一个带有公共字段和相应的getter / setter的类:

public class User {
    public String name;
    public String getName() { return name; }
    public void setName(String name) { this.name = name;}
}

现在调用字段name

User user = new User();
user.name = "test";
System.out.println(user.name);

是否能够使用aspectj来增强类以使字节码为:

User user = new User();
user.setName("test");
System.out.println(user.getName());

我知道javassist可以做到这一点,但AspectJ可以做同样的事吗?

2 个答案:

答案 0 :(得分:2)

查看pointcut docs以及get(FieldPattern)set(FieldPattern)切入点。

有一些additional writeup in the same doc

答案 1 :(得分:2)

User user = new User();
user.setName("Bob");  //<- This line matched the pointcut below
user.name = "Alex";  //<- This line too matched the pointcut below
System.out.println("User name is " + user.name);

对于User类主方法中的上述代码,我写了下面的Aspect

public aspect UserAspect {
public pointcut propSet() : set(* User.*);

   void around() : propSet(){
    System.out.println(thisJoinPoint.getSignature() + " is being set");
    proceed();
   }
}

输出是..

String test.User.name is being set
String test.User.name is being set
User name is Bob

所以,我的理解是AspectJ以相同的方式处理成员变量赋值和setter。所以,你可能无法用Javassist

做什么