2013-07-19 5 views
45

Чтение о what kind of bytecode Java 8 produces from lambdas, мне пришло в голову время, когда была выпущена Java 5. Тогда было Retroweaver и other tools для преобразования байт-кода, скомпилированного с JDK 5, для запуска на JRE 1.4.Кто-нибудь еще не предоставил Лямбду-выражения на Java 7?

Кто-нибудь еще создал такой инструмент для поддержки Java 8 lambdas? Это позволило бы Java-разработчикам начать использовать lambdas уже сегодня на Java-качестве JS с качеством производства, без необходимости ждать 6-12 месяцев для выпуска GA-версии Java 8.

Вот мой анализ того, почему такие как backporter должны быть осуществимой относительно легко:

Java 8 лямбды, кажется, не использовать какие-либо функции, которые JVM Java 7 не будет иметь (например, invokedynamic), и java.lang.invoke.LambdaMetafactory класс и его зависимости выглядят как чистая Java, поэтому их можно реализовать в сторонней библиотеке. Таким образом, байт-код, скомпилированный с JDK 8, может быть запущен на JRE 7, добавив стороннюю библиотеку с копией LambdaMetafactory (под другим пакетом) и путем преобразования байт-кода для использования этой метафайлы. Может быть, также генерировать некоторые синтетические классы и методы, чтобы обойти проверки доступности, как это подразумевает java.lang.invoke.MagicLambdaImpl. Или затем создайте анонимные внутренние классы для всех лямбда, как это сделали некоторые из первых JDK с ранним доступом с возможностью лямбда.

+3

В случае никто не сообщает об этом, я могу написать его. Вот (в настоящее время пустой) репозиторий github: https://github.com/orfjackal/retrolambda –

+0

Хммм ... это будет отвечать реальному спросу. Если вы можете заставить его работать правильно и с минимальными ограничениями, я думаю, что это победитель. –

+0

Я немного экспериментировал и выяснил, что с преобразованием байт-кода даже можно запускать классы, скомпилированные для Java 8, непосредственно с JVM Java 7 с соответствующим javaagent. JVM будет принимать классы, даже если у них есть неподдерживаемый формат, если аппаратура с помощью зарегистрированных файловых транскрипторов классов приводит к известному, действительному формату. Я не реализовал все функции (пока), но я думаю, что это многообещающий подход, поскольку сохранение развёрнутых классов без изменений означает, что они могут по-прежнему пользоваться будущими версиями Java 8. – Holger

ответ

44

Существует в настоящее время Retrolambda для преобразования Java-байт-код 8, который использует лямбда-выражения и ссылки метод, чтобы работать на Java 7, 6 или 5 (Java 1.4 дал проверить ошибки, не исследовали дополнительно.)

+1

Отличная работа! Предполагается ли работать с Дальвиком В.М.? – zserge

+0

AFAIK, никто еще не пробовал его на Дальвике, хотя это было упомянуто несколько раз. Вы хотите быть первым, кто проверит это и напишет сообщение в блоге? ;) –

+0

Я слышал, что это работает на Дальвике. См. [Этот комментарий] (http://blog.orfjackal.net/2013/07/lambda-expressions-backported-to-java-7.html?showComment=1374655919855#c222763220984063335). –