Ho questo codice (messo da parte la sua adeguatezza per ora):comportamento diverso in esecuzione e il debug del programma 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);
mi aspetto il secondo println
per stampare 20, come ho sostituito caching delle Integers
con 20. Quando eseguo il debug di un programma in Eclipse, come mi aspetto, ottiene il valore dalla cache e stampa 20, mentre ne stampa 10 in entrambi i casi quando lo eseguo da IDE o invocando java
. Come può essere spiegato questo comportamento?
UPD: Funziona in questo modo se compilato con 1.8 javac. Stampa 10 e 20 se compilato con la versione 1.6.
Si sta stampando 10 in entrambi i casi. Allora perché dovrebbe stampare 20? –
Nel secondo caso è un oggetto, quindi chiama il metodo 'Integer.valueOf' per stamparlo, e in quel metodo prende valori dalla cache che ho appena sostituito con un array riempito con 20. – cliffroot
Interessante problema (anche se stai giocando con il fuoco). – mks