Java аннотации не работают - PullRequest
18 голосов
/ 08 апреля 2009

Я пытаюсь использовать аннотации 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  );

    }
  }

Ответы [ 3 ]

36 голосов
/ 08 апреля 2009

Необходимо указать аннотацию как аннотацию времени выполнения, используя аннотацию @Retention в интерфейсе аннотации.

т.е.

@Retention(RetentionPolicy.RUNTIME)
@interface MyAnnotation{}
23 голосов
/ 08 апреля 2009

Краткий ответ: вам нужно добавить @Retention (RetentionPolicy.RUNTIME) в определение аннотации.

Пояснение:

Аннотации по умолчанию не хранятся компилятором. Они просто не существуют во время выполнения. Поначалу это может показаться глупым, но есть много аннотаций, которые используются только компилятором (@Override) или различными анализаторами исходного кода (@Documentation и т. Д.).

Если вы хотите на самом деле использовать аннотацию с помощью отражения, как в вашем примере, вам нужно сообщить Java, что вы хотите, чтобы она запомнила эту аннотацию в самом файле класса. Эта заметка выглядит так:

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

Для получения дополнительной информации ознакомьтесь с официальными документами 1 и особенно обратите внимание на бит о RetentionPolicy.

3 голосов
/ 13 марта 2012

Использование @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  );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...