【问题标题】:java reflection to create field/value hashmapjava反射创建字段/值hashmap
【发布时间】:2011-11-29 06:06:00
【问题描述】:

我需要创建实体中包含的字段/值的 Hashmap,因此我可以使用它们在包含字段名称标签的字符串中替换它们。

我有这个代码:

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

它将 message 中的所有标签替换为 tags 中的等效值,但为了构建 Map 表,我需要采取“任何”实体,并能够从实体创建地图。那么,我怎样才能做到这一点呢?获取一个例程,在该例程中我发送实体并返回一个包含所有字段和值的 Map。

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

    ...?????

    return map;
}

我知道我可以使用反射,这是我发现完成此任务的唯一方法,但是还有其他方法可以完成相同的操作吗?我的意思是一种更有效的方法。

谢谢。

【问题讨论】:

  • 如果您不知道输入字符串中可以存在哪些标签,反射将是 AFAIK 的唯一方法。
  • 是的@aishwarya,实体可以包含任何类型的数据,所以反射是唯一的方法,谢谢。

标签: java reflection


【解决方案1】:
    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));

O,你的实体应该是你的类的对象,而不是你的类本身。 如果你的字段是私有的并且你有他们的 getter,你应该使用 getMethods() 并检查方法名称是否以“get”前缀开头。像这样:

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

【讨论】:

  • 您好 Ademiban,感谢您的代码,工作得很好!即使我还必须转换方法返回的一些值,因为并非所有这些值都是字符串,但是一旦你有主代码。
  • 布尔值的获取器可能以“is”开头;-)。在将可访问设置为 true 后直接从字段中获取值通常更容易,但您也可以使用方法。
【解决方案2】:

如果你只想得到一张地图,为什么不使用像杰克逊这样的文学作品,那么你可以像这样简单地转换它 Map map = new ObjectMapper().convertValue(object, Map.class);

【讨论】:

    【解决方案3】:

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

    据我所知,反射是完成此任务的唯一方法,除非您要构建地图的类实现某个接口,并且您提取地图的代码知道该接口。

    【讨论】:

      猜你喜欢
      • 2021-08-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多