将 Java 7 编译为 Java 6
我知道Java 7的运行时功能在Java 6中不可用,但是由于没有添加新的字节码,因此新的字节码仅与非Java语言相关,我想知道将Java 7源代码(new语句,菱形运算符)转换为纯Java 6(即能够开始将源代码转换为Java 7而不会失去Java 6兼容性)有多难。invokedynamic
switch
任何指针?
我知道Java 7的运行时功能在Java 6中不可用,但是由于没有添加新的字节码,因此新的字节码仅与非Java语言相关,我想知道将Java 7源代码(new语句,菱形运算符)转换为纯Java 6(即能够开始将源代码转换为Java 7而不会失去Java 6兼容性)有多难。invokedynamic
switch
任何指针?
据我所知,目前还没有解决这个问题的方法。最好的办法是扩展 retrotranslator 来处理 Java 1.7 构造。菱形运算符应该非常简单,因为它根本不需要修改字节码。
您的语句“没有添加新的字节码”是不正确的:有一个新的调用动态字节码,更重要的是,在几种情况下,生成的字节码对1.6 JRE无效,因此反转录翻译器必须修复此问题。
标记 Java 7 javac 输出的 .class 文件,版本为 1.6.0(即 0x32)
printf "\x00\x00\x00\x32" |dd of=Example.class seek=4 bs=1 count=4 conv=notrunc
(根据 http://en.wikipedia.org/wiki/Java_class_file#General_layout)
如果你把它(使用$1作为文件名)放入,你可以用以下方式做所有的类文件:j6patch
find . -name \*.class |xargs -I {} ./j6patch {}
我在大型(~4.8 MB jar)代码库上使用它,甚至在java 6 jar上使用,因此Java 7语言功能可以在Java 5中运行的应用程序上使用。此外,Java 7编译器()还进行了许多额外的优化(例如转义分析),这些优化非常显着地提高了性能。RetroTranslator
javac
与 JRE 1.6 运行时 jar 一起使用可以验证是否未使用 Java 7 运行时功能。RetroTranslator
-verify -target 1.5