@Marker によるインターフェイスとメソッドのアノテーションにもかかわらず、AspectJ がアノテーション付きのクラスとメソッドをインターセプトしないのはなぜですか?

Mary-Kate Olsen
リリース: 2024-10-23 23:02:30
オリジナル
554 人が閲覧しました

Why Doesn't AspectJ Intercept Annotated Classes and Methods Despite Interface and Method Annotations with @Marker?

AspectJ でインターフェイスとメソッドのアノテーション継承をエミュレートする

質問:

@Marker でインターフェイスとメソッドにアノテーションを付けているにもかかわらず、AspectJ アスペクトは注釈付きのクラスとメソッドをインターセプトすることはトリガーされません。 AspectJ がそれらをインターセプトしないのはなぜですか?

答え:

Java のアノテーション継承には制限があります。インターフェイス、メソッド、またはアノテーションのアノテーションは、実装クラス、オーバーライド メソッド、またはアノテーション付きアノテーションを使用するクラスによって継承されません。スーパークラスの注釈型に @Inherited メタ注釈が付けられている場合、クラスのみがスーパークラスから注釈を継承します。

AspectJ による継承のエミュレーション:

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 サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!