Java 自省:要映射的对象

新手上路,请多包涵

I have a Java object obj that has attributes obj.attr1 , obj.attr2 etc. The attributes are possibly accessed through an extra level of indirection: obj.getAttr1() , obj.getAttr2() ,如果不公开的话。

挑战:我想要一个接受对象并返回 Map<String, Object> 的函数,其中键是字符串 "attr1" , "attr2" 对应的值是对象 obj.attr1 , obj.attr2 。我想这个函数会被类似的东西调用

  • toMap(obj) ,
  • or toMap(obj, "attr1", "attr3") (where attr1 and attr3 are a subset of obj ’s attributes),
  • 或者 toMap(obj, "getAttr1", "getAttr3") 如有必要。

我不太了解Java的内省:你如何在Java中做到这一点?

现在,对于我关心的每个对象类型,我都有一个专门的 toMap() 实现,它的样板太多了。


注意:对于那些了解 Python 的人,我想要类似 obj.__dict__ 的东西。或者 dict((attr, obj.__getattribute__(attr)) for attr in attr_list) 对于子集变体。

原文由 Radim 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 393
2 个回答

您可以为此使用 JavaBeans 自省。阅读 java.beans.Introspector 类:

 public static Map<String, Object> introspect(Object obj) throws Exception {
    Map<String, Object> result = new HashMap<String, Object>();
    BeanInfo info = Introspector.getBeanInfo(obj.getClass());
    for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
        Method reader = pd.getReadMethod();
        if (reader != null)
            result.put(pd.getName(), reader.invoke(obj));
    }
    return result;
}

重要警告: 我的代码只处理 getter 方法;它不会找到裸露的字段。对于字段,请参阅 highlycaffeinated 的答案。 :-)(您可能希望将这两种方法结合起来。)

原文由 C. K. Young 发布,翻译遵循 CC BY-SA 3.0 许可协议

用户 JacksonObjectMapper 的另一种方式是 convertValue 例如:

  ObjectMapper m = new ObjectMapper();
 Map<String,Object> mappedObject = m.convertValue(myObject, new TypeReference<Map<String, String>>() {});

原文由 Endeios 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题