运行和调试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);
我希望第二个打印20,因为我用20替换了缓存。当我在Eclipse中调试程序时,它会像我预期的那样,从缓存中获取值并打印20,而在两种情况下,当我只是从IDE或调用运行它时,它都会打印10。如何解释这种行为?println
Integers
java
UPD:如果使用1.8 javac编译,它的工作方式是这样的。如果使用1.6版本编译,它将打印10和20。