web-dev-qa-db-fra.com

Si je compilais un fichier Java avec le JDK le plus récent, une JVM plus ancienne pourrait-elle exécuter les fichiers .class?

Le bytecode dépend-il de la version de Java avec laquelle il a été créé?

35
m4design

Le bytecode dépend-il de la version de Java avec laquelle il a été créé?

Normalement oui. Mais en utilisant les options -source, -target et -bootclasspath , un compilateur 1.7+ peut être utilisé pour créer des fichiers binaires compatibles avec Java 1.1.

10
Andrew Thompson

Le bytecode de la machine virtuelle Java est compatible en aval entre les versions principales de la machine virtuelle Java, mais pas en amont. Cependant, pour obtenir les meilleures informations, vous devez lire les notes de publication de la machine virtuelle Java, car elles indiquent généralement le degré de compatibilité ascendante du bytecode.

Modifier la clarification car cela a provoqué une discussion dans les commentaires

Le bytecode de la JVM est compatible en aval, de sorte que le bytecode d'une JVM est compatible avec les versions ultérieures de la JVM. Par exemple, vous pouvez extraire du bytecode de la machine virtuelle Java 1.4 et l’exécuter en Java 5 ou Java 6 (à l’exception de tout type de problème de régression signalé par Andrew).

Le bytecode de la machine virtuelle Java n'est pas compatible avec les versions antérieures, de sorte qu'il n'est pas garanti que le bytecode d'une machine virtuelle fonctionne dans une version précédente de la machine virtuelle, comme ce serait le cas si vous tentiez d'exécuter du code compilé pour Java 6 dans une machine virtuelle 1.4.2. .

2
wkl

D'abord et avant tout, tous les fichiers Java ont un octet de version dans l'en-tête de la classe. Les versions antérieures ne chargeront pas les classes avec les versions les plus récentes, quelles que soient leurs fonctionnalités.

2
MeBigFatGuy

Le bytecode dépend-il de la version du Java avec lequel il a été créé?

Oui.

Si je compilais un fichier Java dans le dernier kit JDK, une ancienne machine virtuelle Java pourrait-elle exécuter les fichiers .class?

Non, mais l'inverse fonctionnera probablement. Vous aimerez peut-être voir ce fil intéressant , il est question de rétroporter Java.

1
Adeel Ansari

Non, sauf si vous spécifiez comme cible l'ancienne machine virtuelle Java.

Par exemple, avec Java 6, vous pouvez compiler et exécuter Java 1.4 en utilisant: 

javac -target 1.4 SomeClass.Java

De toute évidence, le code source devrait être compatible 1.4.

1
OscarRyz

Vous pouvez compiler des classes compatibles avec les machines virtuelles Java des versions antérieures si vous n'utilisez pas les fonctionnalités disponibles dans les machines virtuelles supérieures.

javac -target 1.5 MyJava.Java 

javac -target 1.4 MonJava.Java

0
jack