我有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仅存在构造函数,并且没有设置方法。
答案 0 :(得分:1)
也许。
这实际上取决于您使用的框架。映射器可以使用多种策略:
选择哪种策略,取决于框架。实际上,这对您来说并不重要。这样的框架的全部目的是为您(取消)序列化信息,而不会打扰您。
有关更多详细信息,请开始阅读他们的documentation。
(为了完整:从我对JSON解析的了解来看,我认为 jackson 使用启发式方法来识别匹配的构造函数和setter方法,而像 gson 这样的库则期望默认(无arg)构造函数,然后使用反射来扫描字段,然后直接更新字段)