1

例如,我有一个带有公共字段和相应 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 可以做到吗?

4

2 回答 2

2

查看切入点文档get(FieldPattern)切入点set(FieldPattern)

在同一个文档中有一些额外的文章

于 2012-06-14T20:03:59.593 回答
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 类的 main 方法中的代码,我写了下面的 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 进行操作

于 2012-06-18T06:05:13.877 回答