JDK 7的哪些功能(不包括invokedynamic,因为它不被java使用)导致新的类文件版本不符合JDK 6.它表明所有功能都可以由生成粘合代码的编译器实现。 例如,switch语句中的String可以使用编译器生成的重复ifeq语句来实现。 我希望能够为编译器提供-source 1.7 -target 1.6标志以符合jre 6,同时在jdk 7中使用项目硬币功能。
如果你用javap查看字节码或使用反编译器并对使用JDK 7编译器生成的.class文件进行逆向工程,你会看到生成的代码"try with resource","binary literals","unserscore in literals","diamond" 运算符"也是有效的JRE 6代码。 但多次捕获是错误的。
现在JDK 7正式推出,它显然不支持将Java 7源代码编译为Java 6类文件:javac -source 1.7 -target 1.6 Test.java给出javac: source release 1.7 requires target release 1.7。 我也有兴趣了解为什么会这样。
请参见:oracle.com/technetwork/java/javase/compatibility-417013.html
"switch语句中的字符串可以使用重复的ifeq实现"。 实际上,为了性能,它会散列常量字符串并使用开关中的常量(使用if检查着陆)。 这对开发人员来说很难自己做。
我还没有读过编译器的代码,但是一些新功能显然必须对字节码产生影响。
"简化的varargs方法调用"实际上只是一个警告抑制,但它必须在字节码中留下一些标记,以便客户端代码可以以不同方式显示警告。
"Try-with-resources"生成的代码可以处理正常异常以及在finally块期间抛出的第二个异常。使用新的addSuppressed()方法存储额外的异常。这不是一个类文件格式更改,但它显然不适用于早期的VM。
"Multi-catch"还产生的字节码与以前的编译器产生的字节码略有不同。现在,异常表中的多个条目将指向相同的catch主体。
多捕获的东西并不重要,因为它仍然是有效的50.0字节码。
这里有一些建议:stackoverflow.com/a/18368608/166524
所以,让我确保我理解这一点。您希望在应用程序中针对不同的JRE运行特定的类,然后是所有其他类吗?我认为这在理论上是可行的,如果在每个类的使用中你不想使用不同的版本,你就可以启动一个单独的JVM。这将涉及一定程度的复杂性,相当于在不相交的应用程序中在两个JVM之间传递信息。开箱即用它不会这样工作,因为6中的执行环境不会知道项目硬币功能。 IIRC你不能在1.4运行时使用泛型,那么这有什么不同呢?在一天结束时,它似乎真的不值得,然后再次,也许我完全错过了你的观点。
同意Woot4Moo。为什么不重新编译JDK 7(特别是在月末发布时)?为什么留在6?你有没有指定的约束吗?即便如此,它可能比它的价值还要多。如果你想要像String开关这样的东西,那么只需编写简单的if-else语句。它们具有可读性,能够满足您的需求。
@ Woot4Moo - 我想你可能误解了这个问题。这听起来更像是OP希望在1.7编译器中使用COIN功能,同时仍然生成可以在1.6 JRE中运行的代码。 @Chris,为了兼容旧版本的Java JRE和库,有时候有充分的理由进行编译。
是的,正如安迪·托马斯 - 克莱默所说的那样,我想了解用1.7编译器指定-target 1.6并使用项目硬币功能无法编译的技术原因。
@Deniz他们是两个独立的运行时间。您如何期待汽车发动机在飞机上工作?如果针对Java6进行编译,则会获得Java6合规性,如果针对Java7进行编译,则可以获得Java7合规性。您可以针对多个版本进行编译的原因是,部署中无法保证每个人都具有相同的执行环境并且您希望注意它。
@ Woot4Moo我认为你的例子并不好。我完全知道我做不到,但我想知道JDK 7的哪些功能与JDK 6不向后兼容。从我的实验中我可以说尝试使用资源,二进制文字,数字下划线都可以。反编译的JDK 1.7类是完全有效的JDK 1.6类。这表明如果JDK 7编译器在.class文件中放置一个合适的类版本,它们将在JRE 6中工作。但是多捕获功能不向后兼容,反编译类错误。只需尝试反编译JDK 7功能并查看生成的代码。
@Deniz就像我对你原来的帖子所说的那样,JDK7尚未完成,所以一旦发布,这将是一个更好的问题。我认为你为自己做的工作比它值得做的更多,imo
@ Woot4Moo - 你没有回答这个问题,你的假设是假的。首先,在过去的Java版本中,使用-target标志编译早期的JRE既可行又有用。其次,JDK7预计将在两周内发布,最终候选版本可供使用。不再需要猜测。
@Andy一定要正确回答OP的问题,因为我没有这样做。
@ Woot4Moo - 我不知道答案。可以这么说。
如果有任何帮助,我找到了这个文档:download.oracle.com/javase/7/docs/technotes/tools/windows/。不确定这个论点/练习的重点是什么。你只是想弄清楚这些功能是如何兼容编译的,这一点并不明显。我想我通常只是尝试将编译目标定位到目标部署环境。如果代码可以在多个代码上运行,我们编写的代码符合早期版本。是的,我知道你可以在7上编译6。我们之前也做过。我只是不明白为什么这里争论.....