【问题标题】:Has anybody yet backported Lambda Expressions to Java 7?有人将 Lambda 表达式反向移植到 Java 7 吗?
【发布时间】:2013-07-19 08:38:08
【问题描述】:

阅读what kind of bytecode Java 8 produces from lambdas,我想到了Java 5 发布的时间。当时有Retroweaverother 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


【解决方案1】:

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

【讨论】:

  • AFAIK,还没有人在 Dalvik 上尝试过,尽管这个愿望已经被提到过几次。你想成为第一个测试它并写博客文章的人吗? ;)
  • 我听说它适用于 Dalvik。见this comment
  • 非常非常非常危险!这会针对 Java 8 API 编译代码,这些 API 在 Java 7 上可能不同或不存在。直到运行时您才会知道。我强烈建议你避免这种情况!一种稍微不同(但安全)的方法是使用 xtend,它编译为 Java 7 源代码。
  • 您应该无论如何全面测试您的程序。你的观点没有实际意义。
  • @rekire 另一个人为其制作了 Gradle 插件:github.com/evant/gradle-retrolambda
猜你喜欢
  • 2014-07-11
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 2011-09-23
相关资源
最近更新 更多