2011-09-02 9 views
12

Attualmente sono solo in un progetto che utilizza il codice byte java. Io di solito vedo che quando si crea una nuova istanza di classe e invocare un metodo su di esso, il bytecode sarà come:Perché creare DUP quando si crea una nuova istanza

NEW <MyClass> 
DUP 
INVOKESPECIAL <MyClass.<init>> 

Ecco perché dovrebbe fare "DUP"? Dalle specifiche VM, ottengo la descrizione "Duplica il valore più alto nella pila degli operandi e sposta il valore duplicato nella pila degli operandi". Ma perché la duplicazione del valore più alto sullo stack degli operandi è necessaria qui? Grazie.

risposta

19

Poiché INVOKESPECIAL consumerà il valore creato da NEW dallo stack degli operandi, ma potrebbe essere necessario utilizzare effettivamente questo valore, quindi il riferimento viene duplicato in anticipo.

Problemi correlati