Кто-нибудь еще перенес лямбда-выражения в 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 выдала ошибки проверки; дальнейшее исследование не проводилось).

Другие вопросы по тегам