Wie Java-linker funktioniert?
Möchte ich wissen, wie Java-linker arbeitet. Insbesondere, in welcher Reihenfolge es verbindet Klassen, Schnittstellen, Paketen, Methoden und etc in jvm-executable-format. Ich habe einige Informationen hieraber es gibt nicht so viel Informationen über die Verknüpfung um.
InformationsquelleAutor der Frage Kirill Dubovikov | 2011-06-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es keine solche Sache wie ein Java - "linker". Es ist allerdings das Konzept der classloader, die - gegeben ein array von java-byte-codes von "irgendwo" - kann eine interne Repräsentation einer Klasse, die dann verwendet werden können, mit
new
etc.In diesem Szenario Schnittstellen sind nur spezielle Klassen. Methoden und Felder sind verfügbar, wenn die Klasse geladen wurde.
InformationsquelleAutor der Antwort Thorbjørn Ravn Andersen
Zuerst: die Methoden sind immer Teil einer Klasse. Schnittstellen sind im Grunde nur die speziellen Klassen und Pakete sind nur ein Teil des vollständig qualifizierten Namen einer Klasse mit einigen Auswirkungen auf die Sichtbarkeit und die physikalische Organisation der class-Dateien.
So kommt die Frage auf: wie funktioniert eine JVM-Klasse link-Dateien? Die JVM-spec Sie verlinkt sagt:
So, die Frage kann nur beantwortet werden für eine bestimmte JVM-Implementierung.
Darüber hinaus sollte es nie einen Unterschied machen in das Verhalten von Java-Programmen, außer vielleicht für die genaue Stelle, an der die Verknüpfung führen Fehler in der runtime
Error
Instanzen geworfen.InformationsquelleAutor der Antwort Michael Borgwardt
Java nicht tun Verlinkung der Weg C hat. Das Prinzip der Einheit ist die definition der Klasse. Eine Menge, die Anpassung der Klasse Verweis auf seine definition geschieht zur Laufzeit. So könnte man kompilieren einer Klasse gegen eine version einer Bibliothek, aber eine andere version zur Laufzeit. Wenn die entsprechenden Signaturen übereinstimmen, wird alles ok sein. Es gibt einige Futter von Konstanten, die zur compile-Zeit, aber das ist über es.
InformationsquelleAutor der Antwort sblundy
Wie bereits erwähnt der Java-compiler nicht ein linker. Aber JVM hat ein linking-phase, die ausgeführt werden, nachdem laden von Klassen. Die JVM-Spezifikation legt es am besten:
https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.4
InformationsquelleAutor der Antwort Sayat Satybald