Sembra che lo openJDK 8 posizioni metodi privati che non sono final
né static
in vtable. Perché è così quando l'associazione dinamica non viene utilizzata per i metodi privati (dal momento che sono invocati con invokespecial) o viene utilizzata?Perché OpenJDK inserisce metodi privati in vtable?
risposta
Questo viene fatto per gestire alcune rare situazioni quando esiste un metodo sovrascrivibile con lo stesso nome e firma in una superclasse. Sebbene ci sia sicuramente un posto di miglioramento, può essere, mirato per JDK 9.
Vedi https://bugs.openjdk.java.net/browse/JDK-8024368
metodi privati ottengono sempre una voce di vtable per gestire all'indietro compatibilità con le classi - vale a dire che può avere lo stesso nome di un metodo privato locale per la classe e anche ereditare un metodo da la tua superclasse, che verrà ereditata attorno al metodo privato, da tuo figlio.
Quindi, quando viene chiamato un metodo privato, la sua voce vtable non viene mai utilizzata? –
@RadekMicek A destra, questa voce non viene utilizzata nelle chiamate di metodo. – apangin
L'ho pensato ancora e ancora e ancora non capisco. In primo luogo, non capisco quale dovrebbe essere il comportamento effettivo e in secondo luogo, ogni possibile comportamento che posso immaginare potrebbe essere implementato senza aggiungere metodi 'private' alla vTable. – Holger
Cosa intendi con "vtable"? Questo non è C++. – Antimony
Ma l'implementazione è simile a C++, la differenza è che i vtables vengono calcolati quando il programma viene eseguito dal linker. –