2012-03-09 15 views
6

Estoy tratando de jugar con la reflexión y las anotaciones. Por alguna razón, cada vez que agrego una anotación a un campo (o una clase o un método) y uso la reflexión para mirar el campo, veo que su campo annotations es nulo.reflect.Field.annotations always null

Por ejemplo, este código:

public class Test { 
    public static void main(String[] args) throws NoSuchFieldException, SecurityException { 
     System.out.println(Test.class.getField("bl").getAnnotations().length); 
    }  
    @anno 
    public int bl;  

    public @interface anno {}  
} 

impresiones 0.

Por cierto, Java no pasa por alto las anotaciones en general, y cuando (por ejemplo) que utilizo la anotación @Deprecated - Eclipse reconoce y me dice que la clase está en desuso.

Estoy usando Eclipse Indigo y Java SE Development Kit 7 actualización 2. ¡Gracias!

Respuesta

22

Por defecto, las anotaciones no están disponibles para la reflexión. Con el fin de hacerlo, es necesario cambiar la política de retención, es decir

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

Las diversas políticas de retención se pueden encontrar en el Javadoc. El valor predeterminado (por razones misteriosas que nadie parece saber) es CLASS.

+0

skaffman - eres el hombre! – Ginandi

+1

@Ginandi: Es bueno que lo diga :) Alguien todavía pensaba que valía la pena un voto negativo, tenga en cuenta ... – skaffman

+1

@skaffman Por favor, puede reemplazar Rentention on Retention –

4

Revisaría @Retention p. Ej.

@Documented 
@Retention(RetentionPolicy.RUNTIME) 
public @interface Deprecated { 
} 

Si no lo configura, no estará visible durante el tiempo de ejecución.

Cuestiones relacionadas