阅读有关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 所做的那样。