Kompilierzeit vs Laufzeit Dependency - Java
Was ist der Unterschied zwischen compile-Zeit und Laufzeit-Abhängigkeiten in Java?
Es ist im Zusammenhang mit der Klasse Weg, aber wie unterscheiden Sie sich?
InformationsquelleAutor der Frage Kunal | 2010-11-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Compile-time-Abhängigkeit: Sie braucht die Abhängigkeit in Ihrem
CLASSPATH
zu kompilieren Artefakt. Sie werden produziert, weil Sie haben irgendeine Art von "Referenz", um die Abhängigkeit hardcoded im code, wie etwa das aufrufen vonnew
für einige Klassen, die Erweiterung oder die Umsetzung von etwas, das (direkt oder indirekt), oder ein Aufruf der Methode mit der direktenreference.method()
notation.Laufzeit-Abhängigkeit: Sie braucht die Abhängigkeit in Ihrem
CLASSPATH
führen Sie Ihre Artefakt wird. Sie werden produziert, weil Sie das ausführen von code, die auf die Abhängigkeit (entweder in eine Feste Weg oder über Reflexion oder was auch immer).Obwohl compile-time-Abhängigkeit in der Regel impliziert Laufzeit-Abhängigkeit haben, können Sie die compile-Zeit nur Abhängigkeit. Dies basiert auf der Tatsache, dass Java nur links Klasse Abhängigkeiten zu den ersten Zugriff auf die Klasse, so dass, wenn Sie nie den Zugriff auf eine bestimmte Klasse zur Laufzeit, weil eine code-Pfad nie Durchlaufen, Java ignorieren beide die Klasse und deren Abhängigkeiten.
Beispiel
In C.java (erzeugt C.class):
In A.java (erzeugt A.class):
In diesem Fall
A
hat eine compile-time-AbhängigkeitC
durchB
, aber es wird nur die Laufzeit-Abhängigkeit von C, wenn Sie passieren, einige Parameter bei der Ausführungjava dependencies.A
, wie die JVM wird nur versuchen, Sie zu lösenB
's Abhängigkeit vonC
wenn es nur geht, zu führenB b = new B()
. Diese Funktion ermöglicht es Ihnen, zur Laufzeit nur die Abhängigkeiten der Klassen, die Sie in Ihrem code verwenden, Pfade, und ignorieren Sie die Abhängigkeiten der rest der Klassen in das Artefakt.InformationsquelleAutor der Antwort gpeche
Ein einfaches Beispiel zu betrachten, der eine api wie die servlet-api. Machen Sie Ihre servlets zu kompilieren, müssen Sie die servlet-api.jar aber bei der Laufzeit der servlet-container stellt eine servlet-api-Implementierung, so dass Sie nicht brauchen, um hinzuzufügen, servlet-api.jar zu Ihrer runtime-Klasse ist Weg.
InformationsquelleAutor der Antwort Martin Algesten
Muss der compiler den richtigen classpath, um Sie zu kompilieren, ruft zu einer Bibliothek (compile-time Abhängigkeiten)
Die JVM braucht die richtigen Klassenpfad zum laden der Klassen in die Bibliothek, die Sie anrufen (runtime-Abhängigkeiten).
Sie kann in ein paar Möglichkeiten:
1) wenn die Klasse C1 Anrufe Bibliothek Klasse L1 und L1 Anrufe Bibliothek Klasse L2, dann C1 hat eine runtime Abhängigkeit auf L1 und L2, sondern nur eine compile-time-Abhängigkeit von der L1.
2) wenn Ihre Klasse C1 dynamisch erzeugt ein interface I1 mit Klasse.forName() oder einen anderen Mechanismus, und die implementierende Klasse für das interface I1 ist Klasse L1, dann C1 hat eine runtime Abhängigkeit von I1 und L1, aber nur eine compile-time-Abhängigkeit von I1.
Andere "indirekte" Abhängigkeiten, die das gleiche für compile-time und run-time:
3) class C1 extends library Klasse L1 und L1 implementiert das interface I1 und erweitert die Bibliothek-Klasse L2: C1 hat eine compile-time-Abhängigkeit von L1, L2, I1.
4) Ihre Klasse C1 hat eine Methode
foo(I1 i1)
und eine Methodebar(L1 l1)
wo I1 ist eine Schnittstelle, und L1 ist eine Klasse, die einen parameter nimmt, die Schnittstelle I1: C1 hat eine compile-time-Abhängigkeit von I1 und L1.Im Grunde nichts zu tun interessant, muss Ihre Klasse die Schnittstelle mit anderen Klassen und Schnittstellen in den classpath. Die Klassen - /interface-Graphen gebildet, indem die Bibliothek Schnittstellen Erträge der compile-time-dependency chain. Die Bibliothek Implementierungen Rendite die Laufzeit-Abhängigkeit Kette. Beachten Sie, dass die Laufzeit-Abhängigkeit Kette ist Laufzeit-abhängig oder fail-slow: wenn die Umsetzung der L1 kommt es manchmal auf instanziieren ein Objekt der Klasse L2, und diese Klasse wird nur instanziiert, in einem bestimmten Szenario, dann gibt es keine Abhängigkeit, außer in diesem Szenario.
InformationsquelleAutor der Antwort Jason S
Java nicht wirklich verknüpfen Sie alles, was zur compile-Zeit. Es wird nur überprüft, ob die syntax die Verwendung der entsprechenden Klassen findet in den CLASSPATH. Es ist nicht erst zur Laufzeit, wird alles zusammen gestellt und ausgeführt auf der Basis der CLASSPATH damals.
InformationsquelleAutor der Antwort JOTN
Compile-Zeit-Abhängigkeiten sind nur die Abhängigkeiten (andere Klassen), die Sie verwenden direkt in der Klasse sind Sie zu kompilieren. Runtime-Abhängigkeiten umfasst sowohl die direkten und indirekten Abhängigkeiten der Klasse, die Sie gerade laufen. So, runtime-Abhängigkeiten beinhaltet die Abhängigkeiten der Abhängigkeiten und Reflexion von Abhängigkeiten, wie Klassennamen, die man in einem
String
verwendet, sondern inClass#forName()
.InformationsquelleAutor der Antwort BalusC
Für Java -, compile-Zeit-Abhängigkeit, ist dein Quell-code - Abhängigkeit. Zum Beispiel, wenn Eine Klasse ruft eine Methode von Klasse B, dann A ist abhängig von B zur compile-Zeit, da Ein wissen über B (Typ B) zusammengestellt werden. Der trick hier, sollte so sein: Kompilierter code ist nicht eine vollständige und ausführbare code noch. Es beinhaltet austauschbare Adressen (Symbole, Metadaten) für die Quellen, die noch nicht kompiliert oder vorhandenen externen jars. Während die Verknüpfung, diese Adresse muss ersetzt werden durch die tatsächlichen Adressen im Speicher. Um es richtig zu machen, die richtigen Symbole/Adressen erstellt werden sollen. Und diese kann getan werden, mit dem Typ der Klasse (B). Ich glaube, dass ist die Hauptsache Abhängigkeiten zur compile-Zeit.
Runtime-Abhängigkeit ist im Zusammenhang mit der aktuellen flow-of-control. Es involes tatsächliche Speicher-Adressen. Es ist eine Abhängigkeit, die Sie haben, wenn Ihr Programm ausgeführt wird. Sie müssen die Klasse B details-wie hier-Implementierungen, nicht nur die Typ-info. Wenn die Klasse nicht existiert, dann erhalten Sie RuntimeException und die JVM beendet wird.
Beide Abhängigkeiten in der Regel nicht, die Strömung die gleiche Richtung. Dies ist eine Frage der OO-design obwohl.
In C++, die Zusammenstellung ist ein bisschen anders (nicht just-in-time), aber es hat ein linker zu sein. So könnte der Prozess gedacht werden, ähnlich wie Java, denke ich.
InformationsquelleAutor der Antwort zgulser