猿问

Java中反射计算2 + 2 = 5

代码如下:
package basic;

import java.lang.reflect.Field;public class TestField {    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
        @SuppressWarnings("rawtypes")
        Class cache = Integer.class.getDeclaredClasses()[0];
        Field myCache = cache.getDeclaredField("cache");
        myCache.setAccessible(true);
        Integer[] newCache = (Integer[]) myCache.get(cache);        newCache[132] = newCache[133];
        int a = 2;
        int b = a + a;
        System.out.printf("%d + %d = %d", a, a, b);
    }
}

运行结果如下:

2 + 2 = 5

为什么会有这样的输出结果呢?

另外附上内部类IntgerCache的源码如下:


30秒到达战场
浏览 691回答 1
1回答

红颜莎娜

Java中Integer对-127到128的整形数据是有缓存的,你这里通过反射缓存中的第133号数据(既整数5)赋值给了第132号数据(既整数4),所以4就会变成5来表示。在使用int数据计算时结果是正常的,但是在打印时由于做了装箱,int数据变成了Integer,这时会采用缓存,所以4就会打印出5来。
随时随地看视频慕课网APP

相关分类

JavaScript
Java
我要回答