2012-05-21 23 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

हाँ मुझे यह काम मिल गया; धन्यवाद। "प्रकार()" वैकल्पिक बनाने का उनका तरीका है? अभी तक, 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 के बराबर है। - आप शर्तों के अनुसार अपने जेसन का निर्माण

मैं नहीं देख सकता कि आप एनोटेशन के प्रकार के सदस्य के वर्तमान मूल्य को बदल रहे हैं। आपके जैसे सीमों को अब इसकी आवश्यकता नहीं थी।

लेकिन क्या कोई यह जानता है कि इस कार्य को कैसे हल किया जाए?

संबंधित मुद्दे