2012-05-21 4 views
6

¿Cómo se obtienen los valores establecidos dentro de una anotación?obtener el valor de la anotación?

tengo el siguiente anotación definida:

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface JsonElement { 
    int type(); 
} 

Y aquí es el método que utiliza en una clase POJO

@JsonElement(type=GETTER_METHOD) 
public String getUsername{ 
........................ 
} 

Y la clase util que utiliza la reflexión para comprobar si este método tiene la anotación JSonElement presente y para comprobar cuál es el valor de tipo.

Method methods[] = classObject.getClass().getDeclaredMethods(); 

     JSONObject jsonObject = new JSONObject(); 
     try { 
      for (int i = 0; i < methods.length; i++) { 
       String key = methods[i].getName(); 
       System.out.println(key); 
       if (methods[i].isAnnotationPresent(JsonElement.class) && key.startsWith(GET_CHAR_SEQUENCE)) { 
        methods[i].getDeclaredAnnotations(); 
        key = key.replaceFirst(GET_CHAR_SEQUENCE, ""); 
        jsonObject.put(key, methods[i].invoke(classObject)); 
       } 

      } 
      return jsonObject; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return null; 
     } 

¿Cómo puedo saber qué valor tiene type()? Puedo encontrar si la anotación está presente, pero no puedo encontrar un método que descubra qué valor, si hay alguno, se estableció para type().

Respuesta

16
JsonElement jsonElem = methods[i].getAnnotation(JsonElement.class); 
int itsTypeIs = jsonElem.type(); 

Nota que debe estar seguro de que no es jsonElemnull ya sea por su

isAnnotationPresent(JsonElement.class) 

o un simple

if (jsonElem != null) { 
} 

cheque.


Además, si ha cambiado su anotación a

public @interface JsonElement { 
    int type() default -1; 
} 

que no tendría que declarar el atributo type en cada ocurrencia de @JsonElement en el código - que sería por defecto a -1.

También podría considerar el uso de un enum para este lugar de algunas banderas enteros, por ejemplo:

public enum JsonType { 
    GETTER, SETTER, OTHER; 
} 

public @interface JsonElement { 
    JsonType type() default JsonType.OTHER; 
} 
+0

sí lo tengo trabajo; Gracias. ¿Es una manera de hacer que el "tipo()" sea opcional? A partir de ahora, type() debe declararse en la anotación JsonElement – jonney

+0

Editado en la respuesta. –

3

Puede comprobar si la anotación pertenece a JSonElement si sí se puede emitir y llamar a sus métodos

Si bucle a través de toda la anotación a continuación

for(Annotation annotation : methods[i].getAnnotations()) { 
    if(annotation instanceOf(JsonElement)){ 
     ((JsonElement)annotation).getType(); 
    } 
} 

o

JSonElement jSonElement = methods[i].getAnnotations(JSonElement.class); 
jSonElement.getType(); 
2
JsonElement jsonElement = methods[i].getAnnotation(JsonElement.class); 

int type = jsonElement.type(); 
0

solución:

Method methods[] = classObject.getClass().getDeclaredMethods(); 

    JSONObject jsonObject = new JSONObject(); 
    try { 
     for (int i = 0; i < methods.length; i++) { 
      String key = methods[i].getName(); 
      System.out.println(key); 
      if (methods[i].isAnnotationPresent(JsonElement.class) 
        && key.startsWith(GET_CHAR_SEQUENCE) 
        && (methods[i].getAnnotation(JsonElement.class).type() == GETTER_METHOD)) { 

       key = key.replaceFirst(GET_CHAR_SEQUENCE, ""); 
       jsonObject.put(key, methods[i].invoke(classObject)); 

      } 

     } 
     return jsonObject; 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
0

Por lo que entendí, el código hace: - iterate sobre los métodos declarados - compruebe si el método actual se anota con JsonElement.class, su nombre comienza con GET_CHAR_SEQUENCE y el valor del tipo de anotación es GETTER_METHOD. - construyes tu json de acuerdo con las condiciones

No puedo ver que estés cambiando el valor de currenty del miembro de tipo de la propia anotación. Parece que ya no la necesitabas.

Pero, ¿alguien sabe cómo resolver esta tarea?

Cuestiones relacionadas