当前位置: 首页 > 面试题库 >

Java自省:要映射的对象

陶飞英
2023-03-14
问题内容

我有一个Java对象obj具有属性obj.attr1obj.attr2等属性通过额外的间接水平可能访问:obj.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)针对子集变体。


问题答案:

您可以为此使用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方法;它不会找到裸露的田野。有关字段,请参见高度咖啡因的答案。:-)(您可能希望将两种方法结合起来。)



 类似资料:
  • 我有一个对象,我正试图映射到。现在这个有一个名为的枚举,其中包含一些值。我想使用将它们映射到中的其他枚举值。以下是我到目前为止的代码: 当我尝试编译它时,我得到了错误:

  • 我想使用Java流按对用户列表进行分组。 例如,我有。

  • 我正在使用Java11和ProjectReactor(来自Spring)。我需要对RESTAPI进行http调用(在整个流中只能进行一次)。对于响应,我需要计算两件事: 检查数据库(mongodb)中是否存在文档。如果它不存在,则创建并返回它。否则就退回吧 在伪代码中是这样的: 问题是calculateValue需要来自http的返回值。getData,但这已经在第一个flatMap上使用,但我们

  • 问题内容: 是否有Java等效于.Net的Automapper? 问题答案: 检出推土机项目。 推土机支持简单的属性映射,复杂的类型映射,双向映射,隐式-显式映射以及递归映射。 它利用BeanUtils并对其进行扩展。

  • 我有一个用例,其中我需要维护两组JSON输出,一组具有JSON属性的漂亮名称,另一组没有。所以我决定自定义ObjectMapper,以便它忽略字段上的@JSONProperty(“pretty name”)注释,而使用字段属性名。在本例中,希望得到以下JSON输出 具有漂亮名称的JSON输出如下所示 我的ObjectMapper配置代码如下所示 我看了一些其他的答案,但对我不起作用。我得到了一个N

  • 给出以下SQL模式: 我想要一个地图绘制者,比如: 所以我可以这样做: 我不知道怎么做,除了在personMapper之后。getPersons()来操作结果。