Ich bin gespannt, wie die Object-Klasse implementiert ist. Zum Beispiel
Um diese herauszufinden, habe ich eine Quelle von OpenJDK heruntergeladen und angefangen zu graben. Als erstes stieß ich auf die Datei \ openjdksrc \ jdk \ src \ share \ native \ java \ lang \ Object.c enthält unter anderem:
%Vor%und nach meinem Verständnis definiert das Array methods [] eine Zuordnung zwischen den nativen Implementierungen der Methoden von Object. Zum Beispiel ist Objects hashCode () der JVM_IHashCode-Funktion zugeordnet. Der JVM_IHashCode ist in \ openjdksrc \ hotspot \ src \ share \ vm \ prims \ jvm.cpp implementiert. Und hier ist meine erste Frage. Warum ist dies bereits ein Teil der VM selbst (ist bereits in \ openjdksrc \ hotspot \ src \ share \ vm definiert)? Aber gehen wir zum Code von JVM_IHashCode:
%Vor%Warum, wenn das Objekt null ist, geben wir hier 0 zurück? Ich schätze, dass eine NPE geworfen werden sollte. Andernfalls wird der FastHashCode von \ openjdksrc \ hotspot \ src \ share \ vm \ runtime \ synchronizer.cpp aufgerufen und irgendwann wird der get_next_hash aufgerufen, der den reellen Wert berechnet. Sobald es berechnet ist, ist die Frage, wo es gespeichert ist?
%Vor%Also hat die oop-Klasse / struct (? ) eine markOop-Klasse / struct (? ), in der der Hash-Wert gespeichert ist. Funilly Ich kann diese Klassen / Strukturen nicht finden. Alles, was ich finden konnte, war:
%Vor%in \ openjdksrc \ hotspot \ src \ teilen \ vm \ oops \ oop.hpp das scheint MarkOop in einem privaten Bereich zu haben. Aber was ist wirklich "oop", auf das im Rest des Codes Bezug genommen wird? Und wo MarkOop Definition zu finden? Ich habe eine entsprechende gefunden:
%Vor%in \ openjdksrc \ hotspot \ src \ teilen \ vm \ oops \ markOop.hpp, aber es ist nur voll von enums und kann kein Feld finden, in dem der Hash-Wert gespeichert werden kann. Wenn jemand wenigstens einen Teil meiner Fragen beantworten könnte, wäre ich sehr dankbar. Danke!