Java Jackson ObjectMapper使用什么反射机制来修改“final”字段?
Jackson ObjectMapper在初始化后构造对象和修改最终字段的能力可以通过以下简单代码演示: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
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
足以使实例字段可写。在本例中,它可以做到这一点。另请参阅以了解实例变量和静态类变量之间的区别。