如何修改java中的整数加法?

How to modify integer addition in java?

所以基本上我在做一些研究,因为我很好奇它是否可以完成,我找到了这段代码:

import java.lang.reflect.Field;


public class Main {
    public static void main(String[] args) 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];

      int  n = 2+2;
      System.out.println(n);
      System.out.printf("%d",2 + 2);
    }
}

我只是好奇为什么 printf 语句现在 return 5,但打印整数 n 仍然会给我 4。

Java 缓存 256 个 Integer 对象,表示从 -128 到 127 的数字。当 int 装箱到 Integer 时,如果它的值介于 - 128 和 127,将使用缓存中的 Integer 对象。 (Learn more here)。语言如何做到这一点是实现细节。在您的 Java 版本中,它将此缓存存储在 Integer 的内部 class 中,在名为 cacheInteger[] 字段中。在某些其他版本的 Java 中,这可能会改变,因此您的代码可能会中断。

代码的第一部分是获取整数缓存,并将索引 132 设置为与索引 133 相同。由于此数组从 -128 开始,索引 132 对应于 4,索引 133 将是 5 所在的位置。这意味着您已将缓存中的 4 替换为 5.

printf2 + 2 的参数首先计算为 4。然后装箱为 Integer。这是因为 printf 只接受 Object 作为它的第二个参数。因为 4 在 -128 和 127 之间,所以使用了缓存,并且访问了数组的索引 132,因为如果您没有修改数组,那将是 Integer 4 所在的位置。但是你修改了数组,所以它变成了 5。

另一方面,println 仍然打印 4,因为 println 有一个接受 int 的重载,所以那里没有装箱。

对了,你不是在修改“整数加法”,你只是在修改“整数装箱”。