Wenn ich kompiliert ein Java-Datei mit der neuesten JDK, würde eine ältere JVM ausführen kann .die class-Dateien?
Macht der bytecode hängt von der Java-version es erstellt wurde?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Macht der bytecode hängt von der Java-version es erstellt wurde?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dass hängt von drei Dinge:
Den aktuellen Java-Versionen du sprichst. Zum Beispiel, ein 1.4.0 JVM kann code ausführen, zusammengestellt von einer 1.4.2-compiler an, aber eine 1.3.x-JVM nicht1.
Den compilation-flags verwendet. Es ist ein
-target
compiler flag, erzählt Sie, zum generieren von code, die ausgeführt wird, auf eine ältere (Ziel) JVM. Und die-source
compiler flag erzählt es nehmen nur die ältere JVM-Sprache-Funktionen. (Dieser Ansatz funktioniert nicht immer, je nach der Java-Sprache Funktionen von Ihrem code verwendet. Aber wenn der code kompiliert, sollte es funktionieren.)Den library-Klassen, die class-Datei verwendet. Wenn es verwendet Klassen-Bibliothek, die nicht existieren, in den älteren Klassen-Bibliotheken, dann wird es nicht laufen ... es sei denn, Sie können einen Krug, Rücken-ports die Klassen2. Sie können dieses problem vermeiden, indem mithilfe der
-bootclasspath
option kompilieren Sie Ihren code gegen die APIs für die ältere version von Java.Ja, modulo der oben genannten Punkte.
1 - Java 8 JVMS diese besagt: "Oracle' s Java Virtual Machine implementation in JDK Version
1.0.2
unterstützt die Klasse file format-Versionen45.0
durch45.3
inclusive. JDK-releases1.1.*
support-Klasse-Datei-format-Versionen im Bereich45.0
durch45.65535
inclusive. Für k ≥ 2, JDK-release -1.k
unterstützt die Klasse file format-Versionen im Bereich45.0
durch44+k.0
inclusive."2 - Ein backport problematisch sein könnte auch. Zum Beispiel: 1) Dinge, die davon abhängen, native code-Unterstützung würden die meisten wahrscheinlich verlangen, dass Sie implementieren, dass native code-Unterstützung. 2) würden Sie wahrscheinlich benötigen, um alle back-port die JAR-Datei auf den bootclasspath wenn Sie laufen den code auf die älteren JVM.
Normalerweise ja. Aber mit der " source-target und -bootclasspath Optionen, eine 1,7 - + - compiler kann verwendet werden, zum erstellen von Binärdateien sind kompatibel mit Java 1.1
In Erster Linie alle java-Dateien haben eine version byte im header-Klasse. Ältere jvms, die nicht geladen werden Klassen mit neueren Versionen, unabhängig davon, welche Funktionen Sie haben.
JVM-bytecode ist aufwärtskompatibel zwischen den wichtigsten JVM-version, aber nicht abwärtskompatibel. Jedoch, für Sie die besten Informationen, die Sie haben zu Lesen Sie die JVM-release notes, da Sie in der Regel angeben, wie abwärtskompatibel die bytecode ist.
Bearbeiten Klarstellung, da dies verursachte eine Diskussion in den Kommentaren
JVM-bytecode ist aufwärtskompatibel, so dass bytecode von einer JVM ist kompatibel mit später JVM-Versionen. Zum Beispiel können Sie nehmen bytecode von JVM 1.4 und führen Sie es in Java 5 oder Java 6 JVM (abgesehen von jeder Art von regression Probleme wie bereits von Andrew).
JVM-bytecode ist nicht abwärtskompatibel zwischen JVMs, so dass bytecode von einer JVM ist nicht garantiert, um zu arbeiten in einer früheren Version der JVM, als wäre der Fall, wenn Sie versuchen zum ausführen kompilierter code für Java 6 in einer JVM 1.4.2.
Macht der bytecode hängen von der version des java es erstellt wurde?
Ja.
Wenn ich kompiliert ein java-Datei in das neueste JDK, würde eine ältere JVM ausführen kann .die class-Dateien?
Nicht. Aber das Gegenteil funktioniert, ist sehr wahrscheinlich. Sie könnten, wie sehen diese interessanter thread, er spricht über das Zurückportieren Java.
Nein, es sei denn, Sie geben als Ziel die alte JVM.
ZB.mit Java 6 kompilieren Sie und führen Sie in Java 1.4:
Offensichtlich sollte der Quelltext 1.4 kompatibel.
Kompilieren Sie die Klassen, die mit älteren Versionen JVM-kompatibel, wenn Sie nicht verwenden features, die in höheren JVMs.