将Java 7编译为Java 6

Aar*_*lla 28 java porting java-6 java-7

我知道Java 7的运行时功能不适用于Java 6,但由于没有添加新的字节代码,新的字节代码invokedynamic只与非Java语言相关,我想知道转换Java有多难7源代码(新switch语句,菱形运算符)到纯Java 6(即能够开始将源转换为Java 7而不会失去Java 6兼容性).

有什么指针吗?

Ing*_*gel 11

据我所知,目前还没有解决这个问题的办法.最好的办法是扩展反向转换器来处理Java 1.7结构.钻石操作符应该非常简单,因为它根本不需要修改字节码.

您的声明"没有添加新的字节代码"是不正确的:有一个新的invokedynamic字节代码,更重要的是有几种情况下生成的字节码对1.6 JRE无效,因此反向转换器必须修复它.

  • 您必须阅读Java SE 7规范的附件3(http://download.oracle.com/otndocs/jcp/java_se-7-final-eval-spec/index.html),它包含一个PDF文件相对于Java SE 6的差异.粗略地看一下,似乎所有重大变化(例如新的常量池类型)都与invokedynamic支持相关. (2认同)

kar*_*aze 7

使用版本1.6.0(即0x32)的Java 7 javac标记.class文件输出

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)代码库上使用RetroTranslator它,甚至在java 6 jar上使用,因此Java 7语言功能可用于在Java 5中运行的应用程序.此外,Java 7编译器(javac)还有很多额外功能优化(例如逃逸分析)非常显着地提高了性能.

使用RetroTranslatorwith -verify -target 1.5和JRE 1.6运行时jar可以验证是否使用了Java 7运行时功能.

  • 此外,您可以将RetroTranslator与-verify -target 1.5和JRE 1.6运行时jar一起使用,以验证是否未使用Java 7运行时. (2认同)