我很好奇 jackson 是如何创建对象的,包括它的私有(private)属性/字段而没有setter,而只是使用对象为空的构造函数。
我问的原因是,当我反序列化某些属性时,我想基于这些值自动设置其他属性。例如,我不想序列化图像,而只是序列。路径反序列化后,@JsonIgnore
字段Image可以加载实际图像。构建反序列化对象后,尚未分配字段。从逻辑上讲,没有调用 setter/getter 。那么什么巫毒魔法正在触碰我的物体的私处?
public class ItemTemplate {
private String imagePath;
public ItemTemplate() {
System.out.println(imagePath); //Still null
}
public String getImagePath() {
System.out.println(imagePath); //Not being called when deserializing.
return imagePath;
}
}
但是当 jackson 完成反序列化此对象后,就设置了
imagePath
。 最佳答案
第一条评论回答了标题中的问题。 jackson 使用reflection to access private and protected properties。这导致我尝试为imagePath
字段尝试私有(private) setter 。 jackson 确实使用了此设置方法,而不是直接访问该字段。在此 setter 中,我可以使用路径字符串设置实际图像,并且仍然保持私有(private)状态。