Si j'ai compilé un fichier Java avec le nouveau JDK, serait une ancienne JVM être en mesure d'exécuter le .les fichiers de classe?
Ne le bytecode dépendent de la version de Java il a été créé avec?
Vous devez vous connecter pour publier un commentaire.
Qui dépend de trois choses:
Le réel versions de Java dont vous parlez. Par exemple, un 1.4.0 JVM peut exécuter du code compilé par un 1.4.2 compilateur, mais un 1.3.x JVM ne peut pas1.
Les options de compilation utilisées. Il y a un
-target
compilateur drapeau qui permet de générer du code qui sera exécuté sur une ancienne (cible) de la JVM. Et le-source
compilateur drapeau indique qu'il n'acceptons que les plus âgés de la JVM de fonctionnalités de langage. (Cette approche ne fonctionne pas toujours, selon le langage Java les fonctionnalités utilisées par votre code. Mais si le code compile, il devrait fonctionner.)Les classes de la bibliothèque que le fichier de la classe d'usages. Si elle utilise une bibliothèque de classes qui n'existent pas dans les anciennes bibliothèques de classe, alors il ne fonctionnera pas ... à moins que vous pouvez inclure un BOCAL en arrière-ports les classes2. Vous pouvez éviter ce problème en utilisant la
-bootclasspath
option pour compiler votre code par rapport à l'Api de l'ancienne version de Java.Oui, modulo les points ci-dessus.
1 - La Java 8 JVM membres de cette: "Oracle de la Machine Virtuelle Java de mise en œuvre dans le JDK version
1.0.2
prend en charge la classe versions de format de fichier45.0
par45.3
inclusive. JDK communiqués de1.1.*
classe de soutien versions de format de fichier dans la gamme45.0
par45.65535
inclusive. Pour k ≥ 2, JDK version1.k
prend en charge la classe versions de format de fichier dans la gamme45.0
par44+k.0
inclusive".2 - Un rétroportage pourrait être problématique aussi. Par exemple: 1) les Choses qui dépendent de code natif de soutien serait le plus probablement vous demander de mettre en œuvre que du code natif à l'appui. 2), Vous auriez probablement besoin de mettre toute l'arrière-port de fichier JAR sur le bootclasspath lorsque vous exécuter le code sur les anciens de la JVM.
Normalement oui. Mais à l'aide de la source, la cible et -bootclasspath options, 1,7+ compilateur peut être utilisé pour créer des fichiers binaires qui sont compatibles avec Java 1.1
D'abord et avant tout les fichiers java ont une version octet de l'en-tête de classe. Les anciennes machines virtuelles ne sont pas charger les classes avec des versions plus récentes, indépendamment de ce que les caractéristiques qu'ils ont.
Bytecode JVM est compatible entre les grands JVM version, mais pas rétro-compatible. Cependant, pour la meilleure information que vous aurez à lire les notes de version de la JVM, car elles indiquent généralement la façon compatible le bytecode est.
Modifier des éclaircissements dans la mesure où cela a provoqué la discussion dans les commentaires
Bytecode JVM est compatible, tel que le bytecode d'une JVM est compatible avec les dernières versions de la JVM. Par exemple, vous pouvez prendre le bytecode de la JVM 1.4 et l'exécuter dans Java 5 ou Java 6 JVM (à l'exclusion de toute sorte de régression des questions comme l'a souligné André).
Bytecode JVM n'est pas compatible entre les machines virtuelles, telles que le bytecode d'une JVM n'est pas garanti pour fonctionner dans une précédente version de la JVM, comme ce serait le cas si vous tentiez d'exécuter du code compilé pour la version 6 de Java dans un 1.4.2 JVM.
Ne le bytecode dépendent de la version de java il a été créé avec?
Oui.
Si j'ai compilé un fichier java dans le dernier JDK, serait une ancienne JVM être en mesure d'exécuter le .les fichiers de classe?
Pas. Mais à l'opposé de travail, le plus probable. Vous aimeriez voir ce sujet intéressant, il parle le portage de Java.
Pas, sauf si vous spécifiez que de cibler les vieux de la JVM.
Par exemple.avec la version 6 de Java, vous pouvez compiler et exécuter en Java 1.4 utilisation:
Évidemment, le code source doit être de 1,4 compatible.
Vous pouvez compiler les classes qui sont plus âgées (version Jvm compatible si vous n'utilisez pas les fonctionnalités disponibles dans plus Jvm.