1

たとえば、パブリック フィールドと対応するゲッター/セッターを持つクラスがあります。

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

pointcut docsget(FieldPattern)およびpointcuts を確認してくださいset(FieldPattern)

同じ doc に追加の書き込みがあります。

于 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 はメンバー変数の代入とセッターを同じように扱います。そのため、Javassist でできたことができない可能性があります。

于 2012-06-18T06:05:13.877 に答える