2011-08-11 6 views
4

私は例えば、いくつかの注釈(S)とのインタフェースを、持っていたとしますインタフェースを実装するJavaクラスは、アノテーションを自動的に継承できますか?

@SpecialClass 
public interface IFoo { /* ... */ } 

そして、私はインターフェイスを実装するクラスを作成するとします。

public class Foo implements IFoo { /* ... */ } 

が何とかするクラスFooことは可能ですIFooとそのメンバー(例えば、Fooのように自動的に注釈を付けて@SpecialClassなど)から注釈の全部または一部を "継承"するか、自動的にコピーしますか?

これは、Webサービスクラスを実装するための便利である(例えばJAX-WS「wsimportの」ツールによって生成されたもの)を明示的に例えばjavax.jws.WebService実装するクラスへのインタフェース注釈を(コピーすることなく、ただ自分の注釈付きのインターフェイスを実装することにより、javax.xml.ws.RequestWrapper 、など)。

答えて

6

編集:私は一般的な情報や将来の読者のために、ここでこの答えを残してんだけど、アンドレアスは私が逃したいのJavadocの重要なビットを指摘:

注このメタ注釈型を持っていること注釈付きの型を使用してクラス以外のものに注釈を付けると、効果はありません。また、このメタ注釈は注釈をスーパークラスから継承させるだけであることにも注意してください。実装されたインタフェースのアノテーションは効果がありません。

つまり、この状況ではにはなりません。もちろん、アノテーション自体を制御できる場合にのみ便利です。

本当の答えは、どこでもアノテーションを適用する必要があると考えています。あなたが1つを忘れることを心配しているなら、すべてのクラスを見つけるユニットテストを書いて、与えられたインタフェースを実装しているすべてのクラスのアノテーションが存在するかどうかをチェックしてください。


あなたはSpecialClass注釈自体にInherited注釈を適用しようとしたことがありますか?

注釈タイプが自動的に継承されることを示します。継承されたメタアノテーションがアノテーション型宣言に存在し、ユーザーがクラス宣言でアノテーション型を照会し、クラス宣言にこの型の注釈がない場合、そのクラスのスーパークラスは自動的に注釈型に対して照会されます。このプロセスは、このタイプのアノテーションが見つかるか、クラス階層(Object)の最上部に達するまで繰り返されます。スーパークラスにこの型のアノテーションがない場合、そのクラスはそのクラスにそのような注釈がないことを示します。

これは確かにという音です。ちょうどあなたが望むようにと発音します。

+3

実装されたインタフェースのアノテーションは効果がありません*(javaDocを作成してください) –

+1

良い検索ですが、注釈のソースを制御しないと仮定します(例: 'javax.jws.WebService')。 ? – maerics

+0

@Andreas_D:すみません、私はそれを見つけていませんでした。 Doh。編集します。 –

関連する問題