2012-11-14 32 views
0

這是用於獲取字段值和註釋值的代碼,我將這些值放入地圖中,但問題是地圖中存在$this獲取字段名稱和值並將其存儲在地圖中

Map doc = null; 
     String kind = null; 
     Class classObj = obj.getClass(); 
     Annotation[] annotations = classObj.getAnnotations(); 
     for (Annotation annotation : annotations) { 
       Entity entityAnnotation = (Entity)annotation; 
       kind = entityAnnotation.name(); 
       if (entityAnnotation != null){ 
         if (doc == null){ 
          doc = new LinkedHashMap(); 
         } 
         Field[] fields = classObj.getDeclaredFields(); 
         for (Field field : fields){ 
           annotations = field.getDeclaredAnnotations(); 
           String value = null; 
           String fieldName = field.getName(); 
           try { 
             boolean access = field.isAccessible(); 
             field.setAccessible(true); 
             Object fieldValue = field.get(obj); 
             doc.put(fieldName, fieldValue); 
             field.setAccessible(access); 
           } catch (Exception e) { 
             e.printStackTrace(); 
           }        
           // Process fields with annotation 
           for(Annotation fieldAnnotation : annotations){ 
            if (annotation instanceof Id){ 
             Id idAnnotation = (Id) fieldAnnotation; 
             log.info("Field name="+fieldName+" "+ value + " Annotation value: " + idAnnotation.value()); 
             doc.put("_id", value); 
            }         
           } 
         }        
       } 
     } 

測試輸出:

Key=id value=id1 
Key=name value=Eli 
Key=age value=25 
Key=this$0 [email protected] 
+0

請問您可以縮進四個空格嗎? – 2012-11-14 08:57:12

回答

1

字段this$0是參照外部類。

如果您想避免這種情況,請使用static。恕我直言,你應該儘可能使嵌套類靜態,部分是爲了性能,但主要是爲了清晰。如果這不是一個選項,您可以顯式忽略該字段。

順便說一句:如果您創建一個名爲this$0的字段,它將使用字段this$$0this$$$0this$$$$0等。

+0

如何避免被存儲在地圖中,我需要地圖只有字段值(在類中聲明) – xybrek

+0

使類爲靜態,並且不會有字段。如果你不能這樣做,添加'if(!field.getName()。equals(「this $ 0」))' –

+0

它的字段處理的'obj'可以是任何對象。當我構建一個庫時,用戶可以創建任何傳遞並將其傳遞到解析字段值和註釋值的方法 – xybrek

0

您可以使用獲取類變量並存儲在地圖中。 Field [] fields = YourClassName.class.getFields();

+0

如果我只傳遞一個不知道類名的對象會怎麼樣。我只是得到「對象」 – xybrek

+0

你可以看到這個例子。對象屬於任何類。你永遠不需要知道如下面的例子那樣使用。 public static void main(String [] args){ \t \t Object obj = new YourClass(); \t \t java.lang.reflect.Field [] fields = obj.getClass()。getDeclaredFields(); \t \t System.out.println(「Before loop」); \t \t爲(java.lang.reflect.Field中字段:字段) \t \t { \t \t \t的System.out.println(field.getName()); \t \t} \t} –

相關問題