我有這樣的代碼(現在拋開其是否適合):不同的行爲運行和調試程序的Java,Eclipse的
Class<?> cacheClass = Class.forName("java.lang.Integer$IntegerCache");
Field cacheField = cacheClass.getDeclaredField("cache");
cacheField.setAccessible(true);
Field modifiersField = Field.class.getDeclaredField("modifiers");
modifiersField.setAccessible(true);
modifiersField.setInt(cacheField, cacheField.getModifiers() & ~Modifier.FINAL);
Integer betterCache[] = new Integer[255];
for (int i = 0; i < betterCache.length; i++) {
betterCache[i] = 20;
}
cacheField.set(null, betterCache);
System.out.println(10);
System.out.println((Integer) 10);
我預計第二println
打印20,因爲我換成緩存Integers
20。當我在Eclipse中調試程序時,它會像我期望的那樣執行程序,它會從緩存中獲取值並打印20,而當我從IDE或通過調用java
運行時,它會在兩種情況下打印10。這種行爲如何解釋?
UPD: 如果使用1.8 javac編譯,它的工作方式就是這樣。如果使用1.6版進行編譯,它將打印10和20。
您正在兩種情況下都打印10張。那麼爲什麼要打印20呢? –
在第二種情況下,它是一個對象,因此它調用'Integer.valueOf'方法來打印它,並且在該方法中,它從緩存中取值,我用一個填充了20的數組代替。 – cliffroot
有趣的問題(儘管您在播放與火)。 – mks