Кто-нибудь еще перенес лямбда-выражения в Java 7?
Читая о том, какой байт-код Java 8 производит из лямбд, я вспомнил время, когда была выпущена Java 5. В то время существовали Retroweaver и другие инструменты для преобразования байт-кода, скомпилированного с JDK 5, для работы на JRE 1.4.
Кто-нибудь еще создал такой инструмент бэкпортинга для лямбд Java 8? Это позволило бы разработчикам Java начать использовать лямбды уже сегодня на JRE Java 7 производственного качества, без необходимости ждать 6-12 месяцев для выпуска Java 8 GA.
Вот мой анализ того, почему такой backporter должен быть относительно легко реализуем:
В лямбдах Java 8, похоже, не используются какие-либо функции JVM, которых не было бы в Java 7 (например, invokedynamic
) и java.lang.invoke.LambdaMetafactory
Класс и его зависимости выглядят как чистая Java, поэтому должна быть возможность реализовать их в сторонней библиотеке. Таким образом, байт-код, скомпилированный с JDK 8, можно было бы запустить на JRE 7, добавив стороннюю библиотеку с копией LambdaMetafactory (в другом пакете) и преобразовав байт-код для использования этого мета-фактора. Возможно также сгенерировать некоторые синтетические классы и методы, чтобы обойти проверки доступности, как java.lang.invoke.MagicLambdaImpl
похоже подразумевает. Или затем сгенерируйте анонимные внутренние классы для всех лямбд, как это делали некоторые из первых JDK раннего доступа с лямбдой.
1 ответ
В настоящее время существует Retrolambda для преобразования байт-кода Java 8, который использует лямбда-выражения и ссылки на методы, для работы на Java 7, 6 или 5. (Java 1.4 выдала ошибки проверки; дальнейшее исследование не проводилось).