2012-05-21 57 views
6

如何在註釋中設置值?獲取註釋值?

我有以下注釋中定義:

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

這裏是使用它在一個POJO類

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

和使用反射來檢查,如果該方法具有UTIL類中的方法出現JSonElement註釋並檢查類型值是什麼。

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

我如何知道type()值是什麼?我可以找到註釋是否存在,但是我找不到找到爲type()設置了什麼值(如果有)的方法。

回答

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

備註你必須通過你的

isAnnotationPresent(JsonElement.class) 

或簡單

if (jsonElem != null) { 
} 

檢查確保jsonElemnull無論是。


此外,如果你改變了你的註釋

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

你就不會在你的代碼的@JsonElement每一次出現陳述type屬性 - 它會默認爲-1

你也可以考慮使用它來代替某些整數標誌的enum,例如:

public enum JsonType { 
    GETTER, SETTER, OTHER; 
} 

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

是的,我得到它的工作;謝謝。是他們使「type()」成爲可選的方法嗎?到目前爲止,type()必須在JsonElement註釋 – jonney

+0

中進行聲明,並編輯爲答案。 –

3

如果註釋屬於JSonElement如果是你可以投,並調用你的方法可以檢查

如果通過所有的註釋循環再

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

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

int type = jsonElement.type(); 
0

解決方案:

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

從我的理解,你的代碼的作用: - 迭代通過聲明的方法 - 檢查當前方法是否使用JsonElement.class註釋,其名稱以GET_CHAR_SEQUENCE開頭,註釋類型的值等於GETTER_METHOD。 - 你根據條件構建你的json

我看不到你正在改變註釋本身的類型成員的當前值。看起來像你不需要它了。

但有沒有人知道如何得到這個任務整理出來?