Подтвердить что ты не робот

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  );

    }
  }
4b9b3361

Ответ 1

Вам нужно указать аннотацию как аннотацию Runtime, используя аннотацию @Retention в интерфейсе аннотации.

то есть.

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

Ответ 2

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

Пояснение:

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

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

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

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

Ответ 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  );
    }
}