Puedo crear mi anotación

public @interface MyAnnotation {
}

Lo he puesto en campos en mi objeto de prueba

public class TestObject {

    @MyAnnotation 
    final private Outlook outlook;
    @MyAnnotation 
    final private Temperature temperature;
     ...
}

Ahora quiero obtener la lista de todos los campos con MyAnnotation.

for(Field field  : TestObject.class.getDeclaredFields())
{
    if (field.isAnnotationPresent(MyAnnotation.class))
        {
              //do action
        }
}

Pero parece que mi bloque de hacer la acción no se ejecuta nunca, y los campos no tiene ninguna anotación como en el código siguiente se devuelve 0.

TestObject.class.getDeclaredField("outlook").getAnnotations().length;

Es alguien me puede ayudar y decirme qué estoy haciendo mal?

  • 1) Para una mejor ayuda antes, publicar un SSCCE. 2) por Favor, agregue una letra mayúscula al comienzo de las oraciones. También el uso de un capital para la palabra I & nombres propios como Java, abreviaturas y acrónimos como JEE o la GUERRA. Esto hace que sea más fácil para las personas a entender y ayudar.
  • posibles duplicados de Cómo llegar anotaciones de una variable de miembro?
InformationsquelleAutor user902383 | 2013-05-16

2 Comentarios

  1. 66

    Usted necesita para marcar la anotación como disponibles en tiempo de ejecución. Agregue lo siguiente a la anotación de código.

    @Retention(RetentionPolicy.RUNTIME)
    public @interface MyAnnotation {
    }
    • Es correcto. Pero, pensé que la Anotación es para el tiempo de ejecución de uso.
    • No todos los comentarios son para el tiempo de ejecución. Por ejemplo @SuppressWarnings es RetentionPolicy.De ORIGEN, ya que sólo una sugerencia para que el compilador no advertir sobre ciertas cosas.
    • Las anotaciones de Origen (para leer), tiempo de Compilación o en tiempo de ejecución
    • Este es un no-requisito obvio. Me gustaría poder dar más de un pulgar hacia arriba.
  2. 10
    /**
     * @return null safe set
     */
    public static Set<Field> findFields(Class<?> classs, Class<? extends Annotation> ann) {
        Set<Field> set = new HashSet<>();
        Class<?> c = classs;
        while (c != null) {
            for (Field field : c.getDeclaredFields()) {
                if (field.isAnnotationPresent(ann)) {
                    set.add(field);
                }
            }
            c = c.getSuperclass();
        }
        return set;
    }
    • Apache Commons tiene esta funcionalidad: FieldUtils.getFieldsListWithAnnotation(…)

Dejar respuesta

Please enter your comment!
Please enter your name here