杰克逊如何在没有设置者的情况下设置私有属性?

2022-09-02 10:37:18

我很好奇Jackson如何创建对象,包括它的私有属性/字段,没有 setter,并且只使用对象空构造函数。

我问的原因是,当我反序列化某些属性时,我想根据这些值自动设置其他属性。例如,我不想序列化图像,而只想序列化它的路径。一旦路径被反序列化,字段 Image 就可以加载实际图像。在构造反序列化对象后,尚未分配字段。从逻辑上讲,getters没有被调用。那么,是什么巫毒魔法在触摸我的物体?@JsonIgnore

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


答案 1

第一条评论回答了标题中的问题。Jackson 使用反射来访问私有和受保护的属性。这不知何故促使我尝试了该领域的私人二传手。这个二传手确实被杰克逊使用,而不是直接访问该字段。在这个 setter 中,我可以使用路径字符串设置实际图像,并且仍然保持私有。imagePath


答案 2