Чтение о 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 с ранним доступом с возможностью лямбда.
В случае никто не сообщает об этом, я могу написать его. Вот (в настоящее время пустой) репозиторий github: https://github.com/orfjackal/retrolambda –
Хммм ... это будет отвечать реальному спросу. Если вы можете заставить его работать правильно и с минимальными ограничениями, я думаю, что это победитель. –
Я немного экспериментировал и выяснил, что с преобразованием байт-кода даже можно запускать классы, скомпилированные для Java 8, непосредственно с JVM Java 7 с соответствующим javaagent. JVM будет принимать классы, даже если у них есть неподдерживаемый формат, если аппаратура с помощью зарегистрированных файловых транскрипторов классов приводит к известному, действительному формату. Я не реализовал все функции (пока), но я думаю, что это многообещающий подход, поскольку сохранение развёрнутых классов без изменений означает, что они могут по-прежнему пользоваться будущими версиями Java 8. – Holger