私はGuiceのAOPを使用していくつかのメソッド呼び出しをインターセプトしています。私のクラスはインターフェイスを実装しています。Guiceが適切なメソッドを選択できるように、インターフェイスメソッドに注釈を付けたいと思います。Inheritedのjavaドキュメントに記載されているように、アノテーションタイプにInheritedアノテーション実装クラスでアノテーションが付けられていても、アノテーションは継承されません。
また、このメタ注釈は注釈がスーパークラスから継承されるだけであることにも注意してください。実装されたインターフェースの注釈は効果がありません。
これの理由は何でしょうか?オブジェクトのクラスが実行時に実装するすべてのインターフェースを知ることはそれほど難しいことではないので、この決定の背後には十分な理由があるはずです。
そうでなければ、多重継承の問題が発生するからだと思います。
例:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD) @Inherited
public @interface Baz { String value(); }
public interface Foo{
@Baz("baz") void doStuff();
}
public interface Bar{
@Baz("phleem") void doStuff();
}
public class Flipp{
@Baz("flopp") public void doStuff(){}
}
public class MyClass extends Flipp implements Foo, Bar{}
私がこれをすると:
MyClass.class.getMethod("doStuff").getAnnotation(Baz.class).value()
結果はどうなるのでしょうか?「baz」、「phleem」、または「flopp」?
このため、インターフェースの注釈が役立つことはほとんどありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加