Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Jackson ObjectMapper使用什么反射机制来修改“final”字段?_Java_Reflection_Jackson - Fatal编程技术网

Java Jackson ObjectMapper使用什么反射机制来修改“final”字段?

Java Jackson ObjectMapper使用什么反射机制来修改“final”字段?,java,reflection,jackson,Java,Reflection,Jackson,Jackson ObjectMapper在初始化后构造对象和修改最终字段的能力可以通过以下简单代码演示: public class jsonNodeApp { public static void main(String[] args) throws Exception{ ObjectMapper mapper=new ObjectMapper(); Apple apple = mapper.readValue(new File("myapple.jso

Jackson ObjectMapper在初始化后构造对象和修改最终字段的能力可以通过以下简单代码演示:

public class jsonNodeApp {
    public static void main(String[] args) throws Exception{
        ObjectMapper mapper=new ObjectMapper();

        Apple apple = mapper.readValue(new File("myapple.json"), Apple.class); //apple.seeds is 10, not -200
        System.out.println("Look what you made me do.");
    }
}

class Apple {
    final int seeds;

    Apple(){ //invoked by ObjectMapper
        System.out.println("Sole constructor invoked");
        seeds = -200;
    }

    public int getSeeds() { //never called, but existence required by ObjectMapper
        System.out.println("Placeholder getter"); 
        return 7676;
    }
}
而myapple.json只包含
{“种子”:10}

我原以为ObjectMapper会像建议的那样做,但在
Modifier.FINAL
中搜索并没有结果

那么ObjectMapper是如何做到这一点的呢


免责声明:此功能的工业应用可能是有限的,我的不在其中。我只是出于好奇而问。

可能吧。(稍后我会单独回复你的评论,我必须回顾一下,这已经有很长时间了。)看起来,如果一个字段是最终字段,它会进行某种“修剪”——不确定这意味着什么;我认为它必须以某种方式创造条件。我需要更仔细地调查一下。谢谢。该方法旨在收集字段作为属性。在反序列化过程中,它将使用相应的
字段
对象来设置实例变量
setAccessible
足以使实例字段可写。在本例中,它可以做到这一点。另请参阅以了解实例变量和静态类变量之间的区别。可能是。(稍后我会单独回复你的评论,我必须回顾一下,这已经有很长时间了。)看起来,如果一个字段是最终字段,它会进行某种“修剪”——不确定这意味着什么;我认为它必须以某种方式创造条件。我需要更仔细地调查一下。谢谢。该方法旨在收集字段作为属性。在反序列化过程中,它将使用相应的
字段
对象来设置实例变量
setAccessible
足以使实例字段可写。在本例中,它可以做到这一点。另请参阅以了解实例变量和静态类变量之间的区别。