[英]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 語句現在會返回 5,但打印整數 n 仍然會給我 4。
Java 緩存了 256 個Integer
對象,表示從 -128 到 127 的數字。當int
被裝箱為Integer
,如果它的值在 -128 到 127 之間,則將使用緩存中的Integer
對象。 ( 在此處了解更多信息)。 語言如何做到這一點是實現細節。 在您的 Java 版本中,它將此緩存存儲在Integer
的內部類中,位於名為cache
的Integer[]
字段中。 在某些其他版本的 Java 中,這可能會發生變化,因此您的代碼可能會中斷。
代碼的第一部分正在做的是獲取整數緩存,並將索引 132 設置為與索引 133 相同。由於該數組從 -128 開始,因此索引 132 將對應於 4 所在的位置,而索引 133 將是5在哪里。 這意味着您已將緩存中的 4 替換為 5。
printf
的參數2 + 2
首先被評估為 4。然后它被裝箱為一個Integer
。 這是因為printf
只接受一個Object
作為它的第二個參數。 因為 4 介於 -128 和 127 之間,所以使用了緩存,並訪問了數組的索引 132,因為如果您沒有修改數組,那么Integer
4 就在那里。 但是你修改了數組,所以它變成了 5。
另一方面, println
仍然打印 4 因為println
有一個接受int
的重載,所以沒有裝箱發生。
順便說一句,你不是在修改“整數加法”,你只是在修改“整數裝箱”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.