Java的整型类型中如何实现2+2=5-创新互联

Java的整型类型中如何实现2+2=5,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

创新互联服务紧随时代发展步伐,进行技术革新和技术进步,经过十余年的发展和积累,已经汇集了一批资深网站策划师、设计师、专业的网站实施团队以及高素质售后服务人员,并且完全形成了一套成熟的业务流程,能够完全依照客户要求对网站进行网站设计、成都网站建设、建设、维护、更新和改版,实现客户网站对外宣传展示的首要目的,并为客户企业品牌互联网化提供全面的解决方案。

先看下这段神奇的Java代码:

public static void main(String[] args) throws Exception {
      doSomethingMagic();
      System.out.printf("2 + 2 = %d", 2 + 2);
}

Java的整型类型中如何实现2+2=5

执行结果:2 + 2 = 5

Java的整型类型中如何实现2+2=5

那么doSomethingMagic到底做了什么神奇的事情呢?先看代码:

private static void doSomethingMagic() throws Exception {
   Class cache = Integer.class.getDeclaredClasses()[0];
   Field c = cache.getDeclaredField("cache");
   c.setAccessible(true);
   Integer[] array = (Integer[]) c.get(cache);
   array[132] = array[133];
}

所以这个例子其实包含了Java中整型类型Integer的一个知识点。

Java的整型类型中如何实现2+2=5

可能有的朋友对于doSomethingMagic里面的代码有点摸不着头脑,让我们先查看上图第17行 2 + 2反编译出来的代码:

编辑器将2+ 2的值先计算出来,等于4。最后System.out.println打印出来的值,实际上是Integer.valueOf(4)的返回值。

Java的整型类型中如何实现2+2=5

那么我们就查看JDK里Integer.valueOf的实现:

Java的整型类型中如何实现2+2=5

上面的实现代码,从830行到832行,逻辑非常清楚:如果valueOf的参数i在IntegerCache.low和IntegerCache.high之间,即[-128, 127]的闭区间,则直接从IntegerCache这个缓存区域里返回。只有当输入参数i不在[-128,127]区间内,才执行代码832,基于输入参数i创建一个新的Integer实例。

带着这个理念,我们再看doSomethingMagic就清楚多了。这个方法通过Java反射将上图IntegerCache的成员cache设置成可访问:setAccessible(true), 然后将IntegerCache的第132个元素的值用第133个元素的值覆盖。

Java的整型类型中如何实现2+2=5

我们从Eclipse调试器里发现,Integer cache里第132个元素的值为4,第133个元素的值为5。本来Integer.valueOf方法,对于输入4,从Integer cache里返回第132个元素的值,即4。现在这个元素的值被第133个元素即5覆盖了,所以最后得到了 2 + 2 = 5。

用一句话概括这个场景: 2 + 2 = 4 = Integer.valueOf(4) = 5 ( 因为4在Integer cache里对应的记录已经被我们的代码显式替换成了5)。

Java的整型类型中如何实现2+2=5

Java的整型类型中如何实现2+2=5

看完上述内容,你们掌握Java的整型类型中如何实现2+2=5的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联-成都网站建设公司行业资讯频道,感谢各位的阅读!


当前题目:Java的整型类型中如何实现2+2=5-创新互联
文章出自:http://hbruida.cn/article/ipphd.html