2009-04-08 4 views
18

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

    } 
    } 
+0

вы можете изменить код, чтобы удалить локальную переменную или использовать незадействованные «Аннотации»: для (аннотации аннотации: аннотации) {... – blank

ответ

34

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

т.е.

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

Короткий ответ: вам нужно добавить @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 ); 
    } 
}