Czytając o what kind of bytecode Java 8 produces from lambdas, przyszło mi na myśl czasy, kiedy Java 5 została wydana. Wcześniej było Retroweaver i other tools do konwersji kodu bajtowego skompilowanego z JDK 5, aby działał na JRE 1.4.Czy ktoś jeszcze przeniesiony wyrażeń Lambda do Java 7?
Czy ktoś jeszcze utworzył narzędzie do przenoszenia dla lambd Javy 8? Pozwoliłoby to deweloperom Javy zacząć używać lambdas już dziś na JREs Java 7 o jakości produkcyjnej, bez czekania 6-12 miesięcy na wydanie GA GA Java 8.
Oto moja analiza, dlaczego takie jak backporter powinny być możliwe do wdrożenia stosunkowo łatwo:
Java 8 lambdas nie wydają się użyć dowolnego JVM dysponuje że Java 7 nie miałby (np invokedynamic
), a java.lang.invoke.LambdaMetafactory
klasa i jej zależności wyglądają jak czysta Java, więc powinno być możliwe zaimplementowanie ich w zewnętrznej bibliotece. W ten sposób kod bajtowy skompilowany za pomocą JDK 8 mógłby zostać uruchomiony na JRE 7 przez dodanie biblioteki zewnętrznej z kopią LambdaMetafactory (w innym pakiecie) i transformację kodu bajtowego, aby używał tego metafactory zamiast tego. Być może generuje również pewne syntetyczne klasy i metody pomijania kontroli dostępności, jak zdaje się sugerować java.lang.invoke.MagicLambdaImpl
. Albo wygeneruj anonimowe klasy wewnętrzne dla wszystkich lambd, tak jak zrobiły to niektóre z pierwszych JDK o wczesnym dostępie z obsługą lambda.
W przypadku nikt nie zgłasza takiej sprawy wkrótce, mogę ją napisać. Oto (obecnie puste) repozytorium github: https://github.com/orfjackal/retrolambda –
Hmmm ... spełniłoby to realne zapotrzebowanie. Jeśli potrafisz sprawić, by działał poprawnie i przy jak najmniejszych ograniczeniach, myślę, że to zwycięzca. –
Sam eksperymentowałem i odkryłem, że dzięki transformacji kodu bajtowego możliwe jest nawet uruchamianie klas skompilowanych dla Java 8 bezpośrednio za pomocą JVM Java 7 z odpowiednim javaagentem. JVM zaakceptuje klasy, nawet jeśli mają nieobsługiwany format, o ile oprzyrządowanie za pośrednictwem zarejestrowanych tranzystorów klasowych skutkuje znanym, prawidłowym formatem. Nie zaimplementowałem wszystkich funkcji (jeszcze), ale uważam, że jest to obiecujące podejście, ponieważ utrzymywanie wdrożonych klas bez modyfikacji oznacza, że mogą one nadal korzystać z przyszłych wersji Java 8. – Holger