objectmapper如何转换为我的对象,是否创建了新实例

时间:2018-09-05 04:16:59

标签: java

我有MyObject:

public class MyObject {
    private final String name;
    private final int age;
    public MyObject(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // getter, NOT setter here
}

我收到来自kafka的消息,并转换为MyObject:

import com.fasterxml.jackson.databind.ObjectMapper;
....
MyObject myObject = objectMapper.convertValue(kafkaMessage.getData(), MyObject.class);

ObjectMapper是否通过使用MyObject的构造函数创建MyObject的新实例?

MyObject myObject = new MyObject("name", 12);

如果没有,ObjectMapper如何为最终字段设置值?因为MyObject仅存在构造函数,并且没有设置方法。

1 个答案:

答案 0 :(得分:1)

也许。

这实际上取决于您使用的框架。映射器可以使用多种策略:

  • 调用no参数(默认)构造函数,然后调用setter方法。或直接访问类的字段以进行更改。
  • 标识匹配的构造函数并传入参数以及上述内容。

选择哪种策略,取决于框架。实际上,这对您来说并不重要。这样的框架的全部目的是为您(取消)序列化信息,而不会打扰您。

有关更多详细信息,请开始阅读他们的documentation

(为了完整:从我对JSON解析的了解来看,我认为 jackson 使用启发式方法来识别匹配的构造函数和setter方法,而像 gson 这样的库则期望默认(无arg)构造函数,然后使用反射来扫描字段,然后直接更新字段)