45

阅读有关Java 8 从 lambdas 生成什么样的字节码时,我想到了 Java 5 发布的时间。当时有Retroweaver其他工具,用于将使用 JDK 5 编译的字节码转换为在 JRE 1.4 上运行。

有没有人为 Java 8 lambdas 创建过这样的反向移植工具?它可以让 Java 开发人员今天已经开始在生产质量的 Java 7 JRE 上使用 lambda,而无需等待 6-12 个月的 Java 8 GA 版本。

以下是我对为什么诸如 backporter 应该相对容易实现的分析:

Java 8 lambda 似乎没有使用 Java 7 没有的任何 JVM 特性(例如invokedynamic),并且java.lang.invoke.LambdaMetafactory类及其依赖项看起来像纯 Java,因此应该可以在第 3 方库中实现它们。因此,使用 JDK 8 编译的字节码可以在 JRE 7 上运行,方法是添加一个带有 LambdaMetafactory 副本的第 3 方库(在不同的包下),并将字节码转换为使用该元工厂。java.lang.invoke.MagicLambdaImpl正如似乎暗示的那样,也许还会生成一些合成类和方法来绕过可访问性检查。或者然后为所有 lambda 生成匿名内部类,就像一些第一个启用 lambda 的 Early Access JDK 所做的那样。

4

1 回答 1

44

现在有用于转换 Java 8 字节码的Retrolambda,它使用 lambda 表达式和方法引用,以在 Java 7、6 或 5 上工作。(Java 1.4 给出了验证错误;没有进一步调查。)

于 2013-07-23T10:34:16.197 回答