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:
結果:
コンソール ログが表示されました。 prints:
execution(de.scrum_master.app.Application()) execution(void de.scrum_master.app.Application.two())
代替解決策:
アスペクトはインターフェイス内に埋め込み、実装を 1 か所に統合できます。コンパイラが認識できるように、ファイルの名前を
<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 サイトの他の関連記事を参照してください。