私自身の実験とここのドキュメントに基づいています: http://www.eclipse.org/aspectj/doc/released/faq.html#q:initializationjoinpoints
これ:
public class Init {
public static void main (String[] args) {
new Test();
}
}
@Inherited
@interface MyAnnotation {}
@MyAnnotation
class Super {}
class Test extends Super {
Test() {}
}
これは次のようになります。
<constructor-call sig="Test()" >
<staticinitialization sig="Super._init_" />
<staticinitialization sig="Test._init_" />
<initialization sig="Super()" >
<instanceinitializer-execution sig="Super._init_" />
<constructor-execution sig="Super()" />
</initialization>
<initialization sig="Test()" >
<instanceinitializer-execution sig="Test._init_" />
<constructor-execution sig="Test()" />
</initialization>
</constructor-call>
スーパー タイプかテスト タイプかに関係なく、完全に構築された後にインスタンスに対してアクションを実行できるように、ポイントカットに基づいてアドバイスを作成しようとしています。
私はこれを試しました:
pointcut initializedCall(): initialization((@MyAnnotation *).new(..));
after(Super s) returning: this(s) && initializedCall() {
System.out.println("after initialization via aspect");
}
ただし、Test のインスタンスを作成するときに 2 回呼び出されます。Super が初期化された後に 1 回、Test が初期化された後にもう一度。
私はこれを試しました:
pointcut constructorExecution(): execution((@MyAnnotation *).new(..));
after(Super s) returning : target(s) && constructorExecution() {
System.out.println("after constructor execution via aspect");
}
そして、それも 2 回呼び出され、上記と同じように Test のインスタンスを作成します。
最後に、私はこれを試しました:
pointcut constructorCall(): call((@AutowiredClass *).new(..));
after(): constructorCall() {
System.out.println("after constructor call via aspect");
}
一度しか呼び出されないため、これはうまく機能しますが、ここで説明したように、新しく作成されたインスタンスへの参照を取得するために target() を使用することはできません。
前回と同時に実行するだけでなく、インスタンスへの参照を取得する方法はありますか? または、最後まで待つことができるように、アスペクトが再び起動するかどうかを確認する方法はありますか?
ありがとう。
更新: クラスを json との間でシリアル化および逆シリアル化しており、逆シリアル化中に構築後にコードが適切に実行されるようにしたいため、リフレクションで動作するためにもこれが必要です。