web-dev-qa-db-fra.com

Compatibilité ascendante des fichiers de classe JDK 7 avec JDK 6

Quelles fonctionnalités de JDK 7 (à l’exception de invokedynamic car il n’est pas utilisé par Java) entraînant une nouvelle version de fichier de classe non conforme à JDK 6. Il semble que toutes les fonctionnalités pourraient être implémentées par un compilateur générant des codes collants. Par exemple, l'instruction String in switch peut être implémentée à l'aide d'instructions ifeq répétées générées par le compilateur. Je veux pouvoir donner des options -source 1.7 -target 1.6 au compilateur pour qu’elles soient compatibles avec jre 6 et qu’elles utilisent en même temps les fonctionnalités de jeton de projet dans jdk 7.

28
Deniz

Je n'ai pas lu le code du compilateur, mais certaines des nouvelles fonctionnalités doivent évidemment avoir un impact sur le bytecode.

"Invocation de méthode varargs simplifiée" est en réalité simplement une suppression d'avertissement, mais elle doit laisser un marqueur dans le bytecode afin que le code client puisse afficher les avertissements différemment.

"Try-with-resources" génère du code capable de gérer une exception normale plus une seconde exception levée lors du bloc finally. L'exception supplémentaire est stockée à l'aide de la nouvelle méthode addSuppressed () . Ce n'est pas exactement un changement de format de fichier de classe, mais cela ne fonctionnerait clairement pas sur les machines virtuelles antérieures.

"Multi-catch" produit également du code intermédiaire légèrement différent de celui que tout compilateur précédent pourrait produire. Plusieurs entrées dans la table des exceptions pointeront maintenant vers le même corps de capture.

8
Craig P. Motlin

Alors laissez-moi m'assurer de bien comprendre cela. Vous souhaitez exécuter une classe spécifique dans votre application sur un autre JRE que toutes vos autres classes? Je suppose que cela pourrait être théoriquement possible si à chaque utilisation de la classe que vous ne souhaitez pas utiliser une version différente, vous créez une machine virtuelle Java distincte. Cela impliquerait un niveau de complexité équivalent à la transmission d'informations entre deux machines virtuelles Java dans des applications disjointes. En sortie de boîte, cela ne fonctionne pas de cette façon car l'environnement d'exécution de la version 6 ne serait pas au courant des fonctionnalités du projet. IIRC vous ne pouvez pas utiliser les génériques dans une exécution 1.4, alors en quoi est-ce différent? À la fin de la journée, cela ne semble vraiment pas en valoir la peine, mais encore une fois, j’ai peut-être manqué votre propos. 

0
Woot4Moo