L'istruzione invokespecial
JVM viene utilizzata per chiamare i metodi di inizializzazione (<init>
) durante la creazione di nuovi oggetti. La descrizione dell'istruzione suggerisce (ma non chiarisce) che la decisione se chiamare il costruttore di una superclasse o un costruttore della classe corrente dipende dallo stato del flag ACC_SUPER
impostato nel file class
.Qual è lo scopo del flag di accesso ACC_SUPER sui file di classe Java?
dalle specifiche Sun JVM:
Avanti, viene selezionato il metodo risolto per l'invocazione a meno che tutte le seguenti condizioni:
- La bandiera ACC_SUPER (vedi Tabella 4.1, "Classe accesso e modificatori di proprietà ") è impostato per la classe corrente.
- Source (definizione invokespecial
opcode)
L'impostazione del flag ACC_SUPER indica quale dei due semantiche alternative per la sua istruzione invokespecial la macchina virtuale Java è esprimere; esiste la flag ACC_SUPER per la compatibilità con le versioni precedenti per il codice compilato dai compilatori precedenti di Sun per il linguaggio di programmazione Java. Tutte le nuove implementazioni della Java virtual machine dovrebbero implementare la semantica per invokespecial documentata in questa specifica. Tutti i nuovi compilatori del set di istruzioni della macchina virtuale Java devono impostare il flag ACC_SUPER. I compilatori precedenti di Sun hanno generato i flag ClassFile con ACC_SUPER unset. Le vecchie implementazioni Java di macchine virtuali di Sun ignorano il flag se è impostato.
- Source (formato ClassFile
)
La definizione precisa che la bandiera è per la compatibilità con i vecchi compilatori. Tuttavia continua a contraddire con Sun's older Java virtual machine implementations ignore the flag if it is set.
La flag è ancora utilizzata con l'opcode invokespecial
? Da quello che posso dire, sembra non avere alcuno scopo e non riesco a trovare una risorsa che suggerisca di averlo mai fatto.
Grazie.
Questa non è una risposta, ma per capire perché viene usata la bandiera penso che tu abbia anche bisogno di capire cosa significasse la bandiera sotto la specifica della JVM versione 1 - vedi http://java.sun.com/docs/books /jvms/first_edition/html/Instructions2.doc7.html#invokespecial –
Fianco a fianco, non vedo alcuna differenza. – Jivings