Il nostro progetto utilizza una strumentazione bytecode Java. E ci siamo imbattuti in qualche strano comportamento. Supponiamo che il seguente frammento di codice:Differenze nel bytecode java prodotto dai compilatori Oracle ed Eclipse
public void a() {
new Integer(2);
}
javac di Oracle compila il sopra in quanto segue bytecode:
0: new #2; //class java/lang/Integer
3: dup
4: iconst_2
5: invokespecial #3; //Method java/lang/Integer."<init>":(I)V
8: pop
9: return
e compilatore di Eclipse in:
0: new #15; //class java/lang/Integer
3: iconst_2
4: invokespecial #17; //Method java/lang/Integer."<init>":(I)V
7: return
Come si può vedere, Oracle compilatore produce "dup" dopo "new", mentre Eclipse no. Il che è assolutamente corretto in questo caso d'uso, poiché l'istanza Integer appena creata non è affatto utilizzata, quindi non è richiesto alcun "dup".
Le mie domande sono:
- C'è qualche panoramica delle differenze tra i diversi compilatori? Un articolo/post di blog?
- Posso concludere in modo sicuro che se non c'è alcun "dup" tra "nuovo" e "invokespecial", l'oggetto non viene utilizzato dopo l'inizializzazione?
Qual è il tuo obiettivo con lo strumenting del bytecode? Questa differenza ti crea un problema? Nota che non esiste alcuna garanzia su quale codice bytecode produrrà esattamente un compilatore Java.È del tutto possibile che in una versione futura '' javac' di Oracle produrrà qualcosa di diverso da quello che vedi ora - quindi non è una buona idea scrivere un programma che si basa fortemente sul bytecode esatto prodotto dal compilatore. – Jesper
Usi JDK diversi per Eclipse? – Nishant