@Marker でインターフェイスとメソッドにアノテーションを付けているにもかかわらず、AspectJ アスペクトは注釈付きのクラスとメソッドをインターセプトすることはトリガーされません。 AspectJ がそれらをインターセプトしないのはなぜですか?
Java のアノテーション継承には制限があります。インターフェイス、メソッド、またはアノテーションのアノテーションは、実装クラス、オーバーライド メソッド、またはアノテーション付きアノテーションを使用するクラスによって継承されません。スーパークラスの注釈型に @Inherited メタ注釈が付けられている場合、クラスのみがスーパークラスから注釈を継承します。
AspectJ は JVM の制限内で動作するため、回避策が必要です。注釈の継承をエミュレートします。秘訣は、実装クラスとオーバーライド メソッドにアノテーションを手動で追加するアスペクトを作成することです。
<code class="java">public aspect MarkerAnnotationInheritor { // Implementing classes should inherit marker annotation declare @type: MyInterface+ : @Marker; // Overriding methods 'two' should inherit marker annotation declare @method : void MyInterface+.two() : @Marker; }</code>
このアスペクトは、インターフェイスとすべての実装クラスとメソッドにアノテーションを追加し、リテラルのアノテーションの必要性を排除します。それらの要素について。アスペクトを配置すると、必要な AspectJ インターセプトが期待どおりに機能します。
または、アスペクトをインターフェイスに直接埋め込むこともできます。
<code class="java">public interface MyInterface { void one(); void two(); public static aspect MarkerAnnotationInheritor { declare @type: MyInterface+ : @Marker; declare @method : void MyInterface+.two() : @Marker; } }</code>
ファイルの名前を MyInterface.aj に変更すると、 AspectJ はアスペクト定義を認識します。インターフェイスのネストされたメンバーは暗黙的に public static であるため、アスペクト宣言内の修飾子は省略できることに注意してください。
ただし、AspectJ コンパイラの問題により、安定性を確保するために static を明示的に宣言する必要があります。
以上が@Marker によるインターフェイスとメソッドのアノテーションにもかかわらず、AspectJ がアノテーション付きのクラスとメソッドをインターセプトしないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。