2013-07-19 16 views
45

Leggendo di what kind of bytecode Java 8 produces from lambdas, mi è venuto in mente il momento in cui è stato rilasciato Java 5. Allora c'erano Retroweaver e other tools per la conversione di bytecode compilato con JDK 5 per l'esecuzione su JRE 1.4.Qualcuno ha ancora effettuato il backport delle Lambda Expressions su Java 7?

Qualcuno ha ancora creato uno strumento di backporting per Java 8 lambda? Permetterebbe agli sviluppatori Java di iniziare a utilizzare lambdas già oggi su JRE Java 7 di qualità di produzione, senza dover attendere 6-12 mesi per la versione GA di Java 8.

Ecco la mia analisi del motivo per cui, come backporter dovrebbe essere realizzabile in modo relativamente facile:

Java 8 lambda non sembrano utilizzare qualsiasi JVM caratteristiche che Java 7 non avrebbe (ad es invokedynamic), e il java.lang.invoke.LambdaMetafactory la classe e le sue dipendenze sembrano Java puro, quindi dovrebbe essere possibile implementarle in una libreria di terze parti. Pertanto, il codice byte compilato con JDK 8 potrebbe essere eseguito per funzionare su JRE 7 aggiungendo una libreria di terze parti con una copia di LambdaMetafactory (in un altro pacchetto) e trasformando il bytecode per utilizzare invece quella metafactory. Forse anche generare alcune classi sintetiche e metodi per bypassare i controlli di accessibilità, come sembra suggerire java.lang.invoke.MagicLambdaImpl. Oppure genera classi interne anonime per tutti i lambda, come hanno fatto alcuni dei primi JDK di accesso anticipato abilitati a lambda.

+3

Nel caso in cui nessuno riporta una cosa del genere presto, potrei scriverne una. Ecco il repository github (attualmente vuoto): https://github.com/orfjackal/retrolambda –

+0

Hmmm ... questo potrebbe soddisfare una domanda reale. Se riesci a farlo funzionare correttamente e con il minor numero possibile di limitazioni, penso che sia un vincitore. –

+0

Ho sperimentato un po 'da solo e ho scoperto che con la trasformazione bytecode è anche possibile eseguire le classi compilate per Java 8 direttamente con una JVM Java 7 con un javaagent appropriato. La JVM accetterà le classi anche quando hanno un formato non supportato finché la strumentazione tramite tranformer di file di classe registrati avrà un formato valido e noto. Non ho implementato tutte le funzionalità (ancora), ma penso che sia un approccio promettente in quanto mantenere inalterate le classi implementate significa che potrebbero ancora trarre vantaggio dalle future versioni di Java 8. – Holger

risposta

44

V'è ora Retrolambda per la conversione di Java bytecode 8, che utilizza le espressioni lambda e di metodo riferimenti, di lavorare su Java 7, 6 o 5. (Java 1.4 ha dato verificare errori; non indagare ulteriormente.)

+1

Ottimo lavoro! Dovrebbe funzionare anche con Dalvik VM? – zserge

+0

AFAIK, nessuno lo ha mai provato su Dalvik, anche se il desiderio è stato menzionato un paio di volte. Vuoi essere il primo a testarlo e scrivere un post sul blog? ;) –

+0

Ho sentito che funziona su Dalvik. Vedi [questo commento] (http://blog.orfjackal.net/2013/07/lambda-expressions-backported-to-java-7.html?showComment=1374655919855#c222763220984063335). –