22

Java アノテーションを使用しようとしていますが、Java アノテーションが存在することをコードに認識させることができないようです。私は何を間違っていますか?

  import java.lang.reflect.*;
  import java.lang.annotation.*;

  @interface MyAnnotation{}


  public class FooTest
  { 
    @MyAnnotation
    public void doFoo()
    {       
    }

    public static void main(String[] args) throws Exception
    {               
        Method method = FooTest.class.getMethod( "doFoo" );

        Annotation[] annotations = method.getAnnotations();
        for( Annotation annotation : method.getAnnotations() )
            System.out.println( "Annotation: " + annotation  );

    }
  }
4

3 に答える 3

42

アノテーション インターフェイスで @Retention アノテーションを使用して、ランタイム アノテーションとしてアノテーションを指定する必要があります。

すなわち

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{}
于 2009-04-08T05:26:34.383 に答える
26

簡単な答え: @Retention(RetentionPolicy.RUNTIME) をアノテーション定義に追加する必要があります。

説明:

デフォルトでは、注釈はコンパイラによって保持されません。それらは実行時に存在しません。最初はばかげているように聞こえるかもしれませんが、コンパイラ (@Override) またはさまざまなソース コード アナライザー (@Documentation など) だけが使用する注釈がたくさんあります。

例のようにリフレクションを介して実際に注釈を使用したい場合は、クラスファイル自体にその注釈を書き留めてほしいことを Java に知らせる必要があります。そのメモは次のようになります。

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{}

詳細については、公式ドキュメント1を参照してください。特に、RetentionPolicy について少し注意してください。

于 2009-04-08T05:30:10.460 に答える
3

@Retention(RetentionPolicy.RUNTIME) 以下のコードを確認してください。それは私のために働いています:

import java.lang.reflect.*;
import java.lang.annotation.*;

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation1{}

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation2{}

public class FooTest {
    @MyAnnotation1
    public void doFoo() {
    }

    @MyAnnotation2
    public void doFooo() {
    }

    public static void main(String[] args) throws Exception {
        Method method = FooTest.class.getMethod( "doFoo" );
        for( Annotation annotation : method.getAnnotations() )
            System.out.println( "Annotation: " + annotation  );

        method = FooTest.class.getMethod( "doFooo" );
        for( Annotation annotation : method.getAnnotations() )
            System.out.println( "Annotation: " + annotation  );
    }
}
于 2012-03-12T21:02:38.450 に答える