有没有人将Lambda表达式向后移植到Java 7?

Esk*_*ola 45 java lambda backport java-7 java-8

阅读Java 8从lambdas中产生的字节码类型,我想起了Java 5发布的时候.当时有Retroweaver其他工具用于转换用JDK 5编译的字节码以在JRE 1.4上运行.

还有人为Java 8 lambdas创建了这样一个后向移植工具吗?它将让Java开发人员今天开始在生产质量的Java 7 JRE上使用lambdas,而不必等待6到12个月的Java 8 GA版本.

以下是我对后向传递器应该相对容易实现的原因的分析:

Java 8 lambdas似乎没有使用Java 7不具备的任何JVM功能(例如invokedynamic),并且java.lang.invoke.LambdaMetafactory该类及其依赖项看起来像纯Java,因此应该可以在第三方库中实现它们.因此,使用JDK 8编译的字节码可以通过添加带有LambdaMetafactory副本的第三方库(在不同的包下)并通过转换字节码来使用该元数据来在JRE 7上运行.也许还会生成一些合成类和方法来绕过可访问性检查,这java.lang.invoke.MagicLambdaImpl似乎意味着.或者为所有lambdas生成匿名内部类,就像一些支持lambda的早期访问JDK一样.

Esk*_*ola 44

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

  • 非常非常非常危险!这将针对Java 8 API编译代码,这些API可能与Java 7不同或不存在.在运行时之前,您永远不会知道.我强烈建议你避免这个!稍微不同(但安全)的方法是使用xtend,它编译为Java 7源代码. (3认同)
  • 你应该*无论如何*完全测试你的程序.你的观点没有实际意义. (2认同)