2012-05-21 1 views
6

Wie erhalten Sie Werte innerhalb einer Annotation?Annotationswert erhalten?

Ich habe die folgende Anmerkung definiert:

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

Und hier ist die Methode, die es in einer POJO-Klasse verwendet

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

Und die util-Klasse, die Reflexion verwendet, um zu überprüfen, ob diese Methode hat die JSonElement-Annotation vorhanden und um zu überprüfen, was der Typwert ist.

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

Wie finde ich heraus, was type() Wert ist? Ich kann feststellen, ob die Annotation vorhanden ist, aber ich kann keine Methode finden, die herausfindet, welcher Wert - wenn überhaupt - für type() gesetzt wurde.

Antwort

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

Hinweis dass Sie müssen sicher sein, dass jsonElem nicht null entweder von Ihrem

isAnnotationPresent(JsonElement.class) 

oder eine einfache

if (jsonElem != null) { 
} 

Scheck ist.


Außerdem, wenn Sie Ihre Anmerkung zu

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

Sie würden nicht das type Attribut bei jedem Auftreten von @JsonElement in Ihrem Code angeben müssen - es -1 Standard würde.

Sie könnten auch erwägen, eine enum für diese anstelle von einigen ganzzahligen Flags, zum Beispiel:

public enum JsonType { 
    GETTER, SETTER, OTHER; 
} 

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

ja ich habe es funktioniert; Vielen Dank. Ist das eine Möglichkeit, "type()" optional zu machen? Ab sofort muss type() in der JsonElement-Annotation – jonney

+0

Edited in die Antwort deklariert werden. –

3

Sie können prüfen, ob Annotations wenn ja JSonElement gehört können Sie Ihre Methoden

werfen und rufen Wenn durch alle Annotation Looping dann

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

oder

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

int type = jsonElement.type(); 
0

Lösung:

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

Von dem, was ich verstanden, Ihr Code tut: - Iterierte über die deklarierten Methoden - überprüfen, ob die aktuelle Methode mit JsonElement.class annotiert ist, der Name beginnt mit GET_CHAR_SEQUENCE und der Wert des Annotationstyps ist gleich GETTER_METHOD. - Sie bauen Ihre Json nach Bedingungen

Ich kann nicht sehen, dass Sie den aktuellen Wert des Typs Mitglied der Annotation selbst ändern. Seeme wie du es nicht mehr gebraucht hast.

Aber weiß jemand, wie man diese Aufgabe aussortiert?