我很好奇 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)状态。

10-04 18:12