2009-04-08 26 views
18

Sto tentando di utilizzare le annotazioni Java, ma non riesco a ottenere che il mio codice riconosca che esiste. Cosa sto sbagliando?Le annotazioni Java non funzionano

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

si potrebbe desiderare di modificare il codice per rimuovere le 'annotazioni' inutilizzati variabile locale o l'uso: per (annotazione Annotazione: annotazioni) {... – blank

risposta

34

è necessario specificare l'annotazione come un'annotazione runtime utilizzando l'annotazione @Retention sull'interfaccia annotazione.

cioè

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

Risposta breve: è necessario aggiungere @Retention (RetentionPolicy.RUNTIME) alla definizione di annotazione.

Spiegazione:

annotazioni sono di default non tenuto dal compilatore. Semplicemente non esistono in fase di runtime. Questo può sembrare sciocco all'inizio, ma ci sono molte annotazioni che vengono usate solo dal compilatore (@Override) o da vari analizzatori di codice sorgente (@ Documentation, ecc.).

Se si desidera utilizzare effettivamente l'annotazione tramite riflessione come nell'esempio, è necessario consentire a Java di sapere che si desidera prendere nota di tale annotazione nel file di classe stesso. Tale nota è simile al seguente:

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

Per ulteriori informazioni, consultare la documentazione ufficiale 1 e soprattutto notare il po 'di RetentionPolicy.

3

Utilizzare @Retention(RetentionPolicy.RUNTIME) Controllare il codice riportato di seguito. Si sta lavorando per me:

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 ); 
    } 
} 
Problemi correlati