AspectJ を使用した Java でのアノテーション継承のエミュレーション
Java では、インターフェイス、メソッド、またはアノテーションのアノテーションは、実装クラスによって自動的に継承されません。 、メソッドのオーバーライド、または注釈付きの注釈。 Java の @Inherited アノテーションでは、クラスとサブクラスのアノテーションの継承が可能ですが、前述のシナリオには拡張されません。
AspectJ は、型間宣言 (ITD) を定義することでアノテーションの継承をエミュレートできます。 ITD は、コンパイル時に型、メソッド、およびフィールドの注釈をプログラムで追加および変更する方法を提供します。
この例では、@Marker 注釈を使用して、インターフェイス MyInterface とそのメソッド two() に注釈を付けます。ただし、@Marker アノテーションが付けられたクラスとメソッドの実行をインターセプトすることになっている AspectJ アスペクトはトリガーされません。
解決策:
インターフェイスとアノテーションの継承をエミュレートするには
<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>
このアスペクトは基本的に @Marker アノテーションをすべての実装クラスに追加し、MyInterface のメソッドをオーバーライドして、アノテーションの継承を効果的にエミュレートします。
代替解決策:
自己完結型のアノテーション継承実装を作成して、アスペクトをインターフェイスに直接埋め込むこともできます:
<code class="java">public interface MyInterface { // ... // Embedded AspectJ aspect public static aspect MarkerAnnotationInheritor { // ... } }</code>
注: AspectJ を使用してアノテーションの継承をエミュレートする場合、ITD アスペクトは、ソース コード内で参照する型またはメソッドの宣言の前に配置する必要があります。これにより、AspectJ コンパイラーは通常の Java コンパイル フェーズの前に ITD を適用します。
以上がAspectJ を使用して Java でインターフェイスのアノテーション継承をエミュレートし、メソッドをオーバーライドする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。