2011-11-29 117 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

我知道我可以使用反射和这是唯一的方法,我发现 完成这项工作,但是有没有其他方式来完成 相同?

据我所知,反射是实现这一目标的唯一方法,除非你想从构建地图的类实现一些接口,并且你的代码提取地图知道这个接口。