2009-04-08 12 views
18

Estoy intentando utilizar anotaciones Java, pero parece que no puede conseguir mi código de reconocer que uno existe. ¿Qué estoy haciendo mal?Java anotaciones no trabaja

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

es posible que desee modificar el código para eliminar la variable o el uso local de los no utilizados 'anotaciones': for (Anotación anotación: anotaciones) {... – blank

Respuesta

34

Es necesario especificar la anotación como una anotación en tiempo de ejecución utilizando la anotación @Retention en la interfaz de anotación.

decir

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

Respuesta corta: es necesario agregar @Retention (RetentionPolicy.RUNTIME) a ​​su definición anotación.

Explicación:

anotaciones son por defecto no mantenido por el compilador. Simplemente no existen en tiempo de ejecución. Esto puede sonar tonto al principio, pero hay muchas anotaciones que solo son utilizadas por el compilador (@Override) o varios analizadores de código fuente (@Documentation, etc.).

Si realmente desea USAR la anotación mediante reflexión como en su ejemplo, deberá informar a Java que desea que anote esa anotación en el archivo de clase. Esa nota es el siguiente:

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

Para obtener más información, echa un vistazo a los documentos oficiales 1 y especialmente en cuenta lo de RetentionPolicy.

3

Uso @Retention(RetentionPolicy.RUNTIME) Compruebe el código de abajo. Se está trabajando para mí:

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