20

インターフェイスメソッドをアノテーションでオーバーライドするメソッドの実行に適用されるアスペクトポイントカットを書くにはどうすればよいですか? 例えば:

interface A {
  @MyAnnotation void method();
}
class B implements A {
  void method();
}

ポイントカットは、注釈自体がexecution(@MyAnnotation * *.*(..))含まれている場合にのみ一致します。B.method()これを行う別の方法はありますか?

4

3 に答える 3

12

Nicholas が指摘したように、これは AspectJ では不可能です。これが不可能な理由の詳細な証拠は次のとおりです ( http://www.eclipse.org/aspectj/doc/released/adk15notebook/annotations-pointcuts-and-advice.htmlセクション注釈継承とポイントカット マッチングから取得):

Java 5 仕様によると、型以外の注釈は継承されず、型の注釈は @Inherited メタ注釈がある場合にのみ継承されます。c2.aMethod (この例では b.method() になります) の呼び出しは一致しません。これは、修飾子 (可視性修飾子、注釈、および throws 句) のジョイン ポイント マッチングがジョイン ポイントのサブジェクト (メソッドが実際に呼び出されます)。

この同じ問題に苦しんでいたので、そのようなメソッドのポイントカットを作成できるようにする小さなメソッド/ライブラリを作成しました。これがあなたの例でどのように機能するかです:

myAnnotationIsExecuted(): execution(public * *.*(..)) && 
             if(implementsAnnotation("@MyAnnotation()", thisJoinPoint));

また

myAnnotationIsExecuted(): execution(public * A+.*(..)) &&
             if(implementsAnnotation("@MyAnnotation()", thisJoinPoint));

メソッドimplementsAnnotation(String,JoinPoint)はライブラリからのものです。実装されたメソッドに指定された注釈が含まれているかどうかをチェックする基本的なメソッド。

メソッド/ライブラリの詳細については、こちらを参照してください。

于 2011-09-19T03:23:05.217 に答える
4

アップデート

Springでは実行できないように見えるので(元の回答を参照)、実装クラスの各メソッドに注釈を追加する必要があると思います。これを行う明白な方法がありますが、より自動化された方法を探している場合は、自分で作成する必要があると思います。

特定の注釈を探す自家製のポスト プロセッサのようなものを想像できます@ApplyThisAnnotationToAllWhoInheritMe。この注釈が見つかると、継承メンバーのソースコードをスキャンし、コンパイルが行われる前に必要な場所に要求された注釈を追加します。

とにかく、これを行うために Spring AOP を使用している場合は、実装者のメソッドにある必要があるようです。これが役立つことを望んでいるクラスが制御できない場合は、独自の Spring AOP ツールを作成する必要がある場合があります。

元の回答

Spring 3.0 ドキュメントから:

AspectJ は、インターフェースのアノテーションが継承されないという Java の規則に従います。

7.8.2 Other Spring aspects for AspectJの一部であるセクション でこのビットを見つけたので7.8 Using AspectJ with Spring applications、これはグローバル ルールだと思います。

于 2011-08-24T16:26:18.570 に答える
2
//introducing empty marker interface
declare parents : hasmethod(@MyAnnotation * *(..)) implements TrackedParentMarker;

public pointcut p1() : execution(* TrackedParentMarker+.*(..));

また、–XhasMember コンパイラ フラグを有効にする必要があります。

于 2011-08-25T09:29:31.460 に答える