Es scheint, dass openJDK 8 private Methoden, die nicht final
noch static
in Vtable sind. Warum ist es so, wenn die dynamische Bindung nicht für private Methoden verwendet wird (da sie mit invokespecial aufgerufen werden) oder wird sie verwendet?Warum platziert OpenJDK private Methoden in vtable?
Antwort
Dies wird getan, um einige seltene Situationen zu behandeln, wenn eine überschreibbare Methode mit demselben Namen und derselben Signatur in einer Oberklasse existiert. Obwohl es auf jeden Fall einen Platz für Verbesserungen, kann für JDK 9.
Siehe abgezielt werden, https://bugs.openjdk.java.net/browse/JDK-8024368
Private Methoden immer einen VTable-Eintrag erhalten, um rückwärts Kompatibilität mit Klassen zu behandeln - also Sie die gleiche haben Name einer privaten Methode lokal für Ihre Klasse und erben auch eine Methode von Ihre Oberklasse, die von Ihrem Kind um die private Methode vererbt werden wird.
Wenn also eine private Methode aufgerufen wird, wird ihr Vtable-Eintrag nie verwendet? –
@RadekMicek Rechts, dieser Eintrag wird nicht in Methodenaufrufen verwendet. – apangin
Ich dachte es immer und immer wieder und verstehe es immer noch nicht. Erstens verstehe ich nicht, welches tatsächliche Verhalten erreicht werden sollte, und zweitens könnte jedes mögliche Verhalten, das ich mir vorstellen kann, implementiert werden, ohne der vTabelle "private" Methoden hinzuzufügen. – Holger
Was meinen Sie mit "vtable"? Das ist nicht C++. – Antimony
Die Implementierung ähnelt jedoch C++, der Unterschied besteht darin, dass Vtables berechnet werden, wenn das Programm vom Linker ausgeführt wird. –