Lire sur le type de bytecode que Java 8 produit à partir des lambdas J'ai pensé à l'époque de la sortie de Java 5. A cette époque, il y avait Retroweaver et autres outils pour convertir le bytecode compilé avec le JDK 5 pour qu'il fonctionne avec le JRE 1.4.
Quelqu'un a-t-il déjà créé un tel outil de backporting pour les lambdas de Java 8 ? Les développeurs Java pourraient ainsi commencer à utiliser les lambdas dès aujourd'hui sur des JRE Java 7 de qualité production, sans avoir à attendre 6 à 12 mois la version GA de Java 8.
Voici mon analyse des raisons pour lesquelles un tel backporter devrait être implémentable relativement facilement :
Les lambdas de Java 8 ne semblent pas utiliser de fonctionnalités de la JVM que Java 7 n'aurait pas (par ex. invokedynamic
), et le java.lang.invoke.LambdaMetafactory
et ses dépendances ressemblent à du pur Java, il devrait donc être possible de les implémenter dans une bibliothèque tierce. Ainsi, le bytecode compilé avec le JDK 8 pourrait être exécuté sur le JRE 7 en ajoutant une bibliothèque tierce avec une copie de LambdaMetafactory (sous un paquet différent) et en transformant le bytecode pour utiliser cette métafactory à la place. On pourrait également générer des classes et des méthodes synthétiques pour contourner les contrôles d'accessibilité, comme par exemple java.lang.invoke.MagicLambdaImpl
semble impliquer. Ou alors, générez des classes internes anonymes pour tous les lambdas, comme l'ont fait certains des premiers JDK Early Access dotés de lambdas.