2009-04-08 8 views
18

J'essaie d'utiliser des annotations Java, mais je n'arrive pas à faire reconnaître mon code par mon code. Qu'est-ce que je fais de mal?Les annotations Java ne fonctionnent pas

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

vous pouvez modifier le code pour supprimer la variable locale inutilisés 'annotations ou de l'utilisation: pour (annotation Annotation: annotations) {... – blank

Répondre

34

Vous devez spécifier l'annotation comme une annotation d'exécution en utilisant l'annotation @Retention sur l'interface d'annotation.

à savoir

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

Réponse courte: vous devez ajouter @Retention (RetentionPolicy.RUNTIME) à votre définition d'annotation.

Explication:

Les annotations sont par défaut pas conservé par le compilateur. Ils n'existent tout simplement pas à l'exécution. Cela peut sembler idiot au début, mais il y a beaucoup d'annotations qui ne sont utilisées que par le compilateur (@Override) ou divers analyseurs de code source (@Documentation, etc).

Si vous souhaitez réellement utiliser l'annotation par réflexion comme dans votre exemple, vous devez indiquer à Java que vous souhaitez qu'il note cette annotation dans le fichier de classe lui-même. Cette note ressemble à ceci:

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

Pour plus d'informations, consultez les documents officiels 1 et surtout noter le peu de RetentionPolicy.

3

Utilisez @Retention(RetentionPolicy.RUNTIME) Vérifiez le code ci-dessous. Il travaille pour moi:

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 ); 
    } 
} 
Questions connexes