2011-11-29 115 views
8

我需要創建一個實體中包含的字段/值的Hashmap,以便我可以使用它們將字符串中包含標籤的字符串替換爲字段名稱。java reflection創建字段/值hashmap

我有這樣的代碼:

public static String replaceTags(String message, Map<String, String> tags) ... 

它取代消息發現等效值標籤所有標籤,但爲了建立映射表我需要採取「任何「實體並能夠從實體創建一個地圖。那麼,我怎麼能做到這一點呢?獲取我發送實體的例程,並返回包含所有字段和值的Map。

public static Map<String, String> getMapFromEntity(Object entity){ 
    Map<String, String> map = new HashMap<String, String>(); 

    ...????? 

    return map; 
} 

我知道我可以使用反射,這是我已經找到了完成這件事的唯一方法,但是否有任何其他方式來完成相同的?我的意思是更有效的方式。

謝謝。

+0

如果您不知道輸入字符串中可以存在哪些標籤,反射將是AFAIK的唯一方法。 – aishwarya

+0

是@aishwarya,實體可以包含任何類型的數據,所以反射是唯一的方法,謝謝。 –

+0

Dup的http://stackoverflow.com/questions/6796187/java-introspection-object-to-map – Vadzim

回答

9
Field[] fields = entity.getClass().getFields(); 
    Map<String, String> map = new HashMap<String, String>(); 
    for(Field f : fields) 
      map.put(f.getName(),(String) f.get(entity)); 

○,你的實體應該是你的類的對象,而不是你的類本身。 如果你的領域是私人和你有干將對他們來說,你應該使用的getMethods()和檢查方法名稱以「獲取」 prefix.Like這樣開始:

Method[] methods = entity.getClass().getMethods(); 
    Map<String, String> map = new HashMap<String, String>(); 
    for(Method m : methods) 
    { 
     if(m.getName().startsWith("get")) 
     { 
      String value = (String) m.invoke(entity); 
      map.put(m.getName().substring(3), value); 
     } 
    } 
+0

你好Ademiban,感謝代碼,工作得很好!,甚至認爲我也必須投下一些返回的值通過這些方法,因爲不是所有的都是字符串,但是一旦你擁有主代碼,這很簡單。 –

+4

布爾值的獲取者可能以「is」;-)開始。在設置爲true的情況下直接從字段獲取值通常更容易,但您也可以執行方法。 – aishwarya

0

我知道我可以使用反射和這是唯一的方法,我發現 完成這項工作,但是有沒有其他方式來完成 相同?

據我所知,反射是實現這一目標的唯一方法,除非你想從構建地圖的類實現一些接口,並且你的代碼提取地圖知道這個接口。