2012-05-21 36 views
6

Ek açıklamaların içine nasıl değerler girilir?ek açıklama değeri olsun?

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

Ve burada bir POJO sınıfına

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

Ve bu yöntem olup olmadığını kontrol etmek yansıma kullanan util sınıfta kullanan yöntemdir:

Aşağıdaki açıklama tanımladıktan JSonElement açıklaması mevcut ve tip değerinin ne olduğunu kontrol etmek için.

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

nasıl type() değerinin ne öğrenebilirim? Ek açıklamanın mevcut olup olmadığını bulabilirim, ancak type() için hangi değerin - eğer varsa - değerini belirleyen bir yöntem bulamıyorum.

cevap

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

Not Eğer

isAnnotationPresent(JsonElement.class) 

veya basit

if (jsonElem != null) { 
} 

çekle jsonElemnull ya olmadığından emin olması gerektiğini. Eğer

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

için ek açıklama değişirse


Ayrıca, kodunuzda @JsonElement her olayın gerçekleşmiş en type niteliğini ifade etmek olmazdı - bu -1 varsayılan olacaktır.

Ayrıca örneğin yerine bazı tamsayı bayrakların bunun için bir enum kullanarak düşünebiliriz:

public enum JsonType { 
    GETTER, SETTER, OTHER; 
} 

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

evet çalışıyorum; Teşekkürler. "type()" ı isteğe bağlı yapmanın bir yolu nedir? Şu andan itibaren,(), JsonElement ek açıklamasında – jonney

+0

cevabında düzenlenmiş olmalıdır. –

3

evet size yöntemleri döküm ve denirse açıklama JSonElement ait olmadığını kontrol edebilirsiniz

ise tüm ek açıklama döngü sonra

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

veya

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

int type = jsonElement.type(); 
0

çözüm:

anladım kadarıyla
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

, kodunuz yapar: - iterate bildirilen yöntemler üzerinde - geçerli yöntemin JsonElement.class ile belirtilip girilmediğini kontrol edin, adı GET_CHAR_SEQUENCE ile başlar ve ek açıklama türünün değeri GETTER_METHOD öğesine eşittir. - jsonunuzu

koşullarına göre kurarsınız, ek açıklamaların türünün geçerli değerini değiştirdiğinizi göremiyorum. Artık ihtiyacın olmadığı gibi görünüyor.

Ama kimse bu görevi nasıl sıralayacağını biliyor mu?