【发布时间】:2013-07-19 08:38:08
【问题描述】:
阅读what kind of bytecode Java 8 produces from lambdas,我想到了Java 5 发布的时间。当时有Retroweaver 和other tools 用于将使用JDK 5 编译的字节码转换为在JRE 1.4 上运行。
有没有人为 Java 8 lambdas 创建过这样的反向移植工具?它可以让 Java 开发人员今天就开始在生产质量的 Java 7 JRE 上使用 lambdas,而无需等待 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 似乎暗示的那样,也许还会生成一些合成类和方法来绕过可访问性检查。或者然后为所有 lambdas 生成匿名内部类,就像一些第一个启用 lambda 的 Early Access JDK 所做的那样。
【问题讨论】:
-
如果没有人很快报告这样的事情,我可能会写一个。这是(当前为空的)github 存储库:github.com/orfjackal/retrolambda
-
嗯...这将满足实际需求。如果你能让它正常工作并尽可能减少限制,我认为它是赢家。
-
我自己进行了一些实验,发现通过字节码转换,甚至可以使用带有适当 javaagent 的 Java 7 JVM 直接运行为 Java 8 编译的类。 JVM 将接受这些类,即使它们具有不受支持的格式,只要通过注册的类文件转换器的检测产生已知的有效格式。我还没有实现所有功能,但我认为这是一种很有前途的方法,因为保持部署的类不被修改意味着它们可能仍会从未来的 Java 8 版本中受益。
标签: java lambda java-7 java-8 backport