Tengo algunas nonull variable (por ejemplo,en1) de Enum tipo. La pregunta es: ¿cómo conseguir las anotaciones relacionadas con la constante de enumeración que hace referencia en1 variable?

  • No estoy seguro de lo que estás tratando de lograr. Es Object en1 = ...; Annotation[] anns = magic(en1);? A continuación, me gustaría preguntar por qué en1 es de tipo Object y no En. Podría dar algunos ejemplos de código como ese?
  • He encontrado la respuesta correcta. Es: en1.getClass().getField(((Enum)en1).name()).getAnnotations();
  • Lo siento. Mi declaración «en1 de algunos enum tipo» significa que en1 es ejemplo de Enum.

5 Comentarios

  1. 34

    Probar este (java reflexión):

    String field = En.AAA.name();
    En.class.getField(field).getAnnotations();

    Debe conseguir que las anotaciones de AAA.

    EDICIÓN:

    Como el autor supone:

    en1.getClass().getField(((Enum)en1).name()).getAnnotations(); 

    Trabaja para él 🙂

    • El uso de .name() sería más seguro que el uso de .toString(), desde toString() puede ser sobrecargado (mientras name() es final).
    • Su respuesta no es completa, porque no sé cuál de los En constantes asignado a en1. Y además he editado mi pregunta justo antes de su respuesta, la aplicación más estricta de los requisitos.
    • Pero no funciona, no? Parece una matriz vacía siempre es devuelto. Y isAnnotationPresent() siempre devuelve false
    • Funciona! Tal vez usted está utilizando no-tiempo de ejecución de anotaciones?
    • asegúrese de que está utilizando @Retention(RetentionPolicy.RUNTIME) en su @interface.
  2. 21

    Como ya he ofrecido:

    en1.getClass().getField(((Enum)en1).name()).getAnnotations();

    Para ser más claro:

    String name = e.name(); //Enum method to get name of presented enum constant
    Annotation[] annos = e.getClass().getField(name).getAnnotations(); //Classical reflection technique

    En este caso no tenemos necesidad de saber real de la clase de en1.

    Ver también: comentario sobre ofuscado caso.

    • parece la misma respuesta de 8 horas antes de la
    • Mira quetion comentarios
  3. 7

    Que acabo de leer de tu comentario que ya encontró la respuesta. Sólo quería remarcar que para otras personas interesadas que, en orden para que funcione, esas anotaciones deben haber sido declaradas con la retención correcta de la política, como este:

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface Anno1 {
       //...
    }

    Sin esto, no serán accesibles en tiempo de ejecución.

    Leer más:

    • También debe tenerse en cuenta que si el @Target anotación presentada debe ser de al menos ElementType.FIELD en ella.
    • Tienes razón, lo he añadido a mi ejemplo.
  4. 4

    Si usted está usando un obfuscator como Proguard, usted podría encontrar que la enumeración de los campos han cambiado de nombre, mientras que .name() todavía devuelve el nombre original del campo. Por ejemplo, este enum…

    enum En {
        FOO,
        BAR
    }

    …sería esto después de ProGuarding…

    enum En {
        a,
        b
    }

    …pero En.FOO.name() regresará "FOO", causando getField(En.FOO.name()) a fallar porque espera que el campo para ser nombrado "a".

    Si quieres obtener el Field para un determinado enum campo de ofuscar el código, usted puede hacer esto:

    for (Field field : En.class.getDeclaredFields()) {
        if (field.isEnumConstant()) {
            try {
                if (en1 == field.get(null)) {
                    Annotation[] annotations = field.getAnnotations();
                }
            } catch (IllegalAccessException e) {
                //
            }
        }
    }
  5. 2

    Más a las respuestas existentes, si usted está en control de la clase enum (puede editar), usted puede simplemente añadir un método a la enumeración a buscar la anotación necesaria es decir,

    AnnotationClass getAnnotation(){
       Field field = this.getClass().getField(this.name());
       return field.getAnnotation(AnnotationClass.class);       
    }

    o todas sus anotaciones:

    Annotation[] getAnnotations(){
       Field field = this.getClass().getField(this.name());
       return field.getAnnotations();
    }

    Ajustar el código anterior para el manejo de excepciones (NoSuchFieldException y SecurityException).

Dejar respuesta

Please enter your comment!
Please enter your name here