ホームページ  >  記事  >  Java  >  AspectJ はインターフェイスとそのメソッドのアノテーション継承を実現できますか?

AspectJ はインターフェイスとそのメソッドのアノテーション継承を実現できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-24 00:35:30313ブラウズ

Can AspectJ Achieve Annotation Inheritance for Interfaces and Their Methods?

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

Java アノテーションの継承は制限されており、アノテーションはインターフェイス、メソッド、またはクラスの実装、メソッドのオーバーライド、またはアノテーション付きアノテーションを利用するクラスによって継承されないアノテーション。この制限は、JVM 制約内で動作する AspectJ に適用されます。

解決策: 特定のケースでのアノテーション継承のエミュレーション

アノテーション継承の一般的な解決策は利用できませんが、回避策はあります。特定のインターフェイスまたはメソッドに対して存在します:

<code class="java">public aspect MarkerAnnotationInheritor {
  // Implementing classes inherit the marker annotation
  declare @type: MyInterface+ : @Marker;
  // Overriding 'two' method inherits the annotation
  declare @method : void MyInterface+.two() : @Marker;
}</code>

Implementation:

  • ITD (型間定義) はインターフェイスにアノテーションを手動で追加し、/クラス/メソッドをオーバーライドします。
  • インターフェイスまたはメソッドの実際のアノテーションは削除できます。

結果:

コンソール ログが表示されました。 prints:

execution(de.scrum_master.app.Application())
execution(void de.scrum_master.app.Application.two())

代替解決策:

アスペクトはインターフェイス内に埋め込み、実装を 1 か所に統合​​できます。コンパイラが認識できるように、ファイルの名前を .aj に変更します。

<code class="java">// MyInterface.aj

public interface MyInterface {
  void one();
  void two();
  
  public static aspect MarkerAnnotationInheritor {
    declare @type: MyInterface+ : @Marker;
    declare @method : void MyInterface+.two() : @Marker;
  }
}</code>

以上がAspectJ はインターフェイスとそのメソッドのアノテーション継承を実現できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。