Java 自省:对象到映射

2022-09-01 00:13:44

我有一个Java对象,它具有属性等。这些属性可能通过额外的间接寻址级别进行访问:、 、 、 (如果不是公共的)。objobj.attr1obj.attr2obj.getAttr1()obj.getAttr2()

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

  • toMap(obj),
  • 或(其中 和 是 属性的子集),toMap(obj, "attr1", "attr3")attr1attr3obj
  • 或者如果有必要的话。toMap(obj, "getAttr1", "getAttr3")

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

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


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


答案 1

用户JacksonObjectMapper的另一种方法是ex:convertValue

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

答案 2

使用Apache Commons BeanUtils:http://commons.apache.org/beanutils/

Map for JavaBeans 的实现,它使用内省来获取属性并将其放入 Bean 中:

Map<Object, Object> introspected = new org.apache.commons.beanutils.BeanMap(object); 

注意:尽管 API 返回(从 1.9.0 开始),但返回的映射中键的实际类是Map<Object, Object>java.lang.String


推荐