title: What reflection mechanism does Jackson ObjectMapper use to modify a `final` field?
body: <p>The ability of the Jackson ObjectMapper to construct an object and modify a final field post-initialization can be demonstrated by this simple code:</p>
  
  <pre><code>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;
      }
  }
  </code></pre>
  
  <p>And myapple.json simply contains <code>{"seeds":10}</code>.</p>
  
  <p>I thought ObjectMapper would do something like that suggested <a href="https://stackoverflow.com/a/3301720/7154924">here</a>, but a search in <a href="https://github.com/FasterXML/jackson-databind" rel="nofollow noreferrer">the source</a> for <code>Modifier.FINAL</code> was not fruitful. </p>
  
  <p>So how does ObjectMapper do this particular trick?</p>
  
  <p>Disclaimer: The industrial application of this feature is likely limited, and mine is not one of them. I am simply asking out of curiosity.</p>