JDK 7 类文件与 JDK 6 的向后兼容性

2022-09-01 14:48:18

JDK 7 的哪些功能(不包括 invokedynamic,因为它不被 java 使用)导致新的类文件版本不符合 JDK 6。所有功能都可以通过编译器生成胶水代码来实现。例如,可以使用编译器生成的重复 ifeq 语句来实现 Switch 语句中的 String。我希望能够为编译器提供 -source 1.7 -target 1.6 标志,使其符合 jre 6,同时在 jdk 7 中使用项目硬币功能。


答案 1

我还没有阅读编译器的代码,但一些新功能显然必须对字节码产生影响。

“简化的 varargs 方法调用”实际上只是一个警告抑制,但它必须在字节码中留下一些标记,以便客户端代码可以以不同的方式显示警告。

“Try-with-resources”生成的代码可以处理一个正常异常以及最终块期间引发的第二个异常。额外的异常是使用新的 addSuppressed() 方法存储的。这并不是类文件格式的更改,但它显然不适用于早期的 VM。

“Multi-catch”还会产生与任何以前的编译器可以产生的字节码有细微的不同。异常表中的多个条目现在将指向同一个捕获正文。


答案 2

因此,让我确保我理解这一点。您想在应用程序中针对与所有其他类不同的 JRE 运行特定类吗?我想这在理论上是可能的,如果你不想使用不同的版本,你启动了一个单独的JVM。这将涉及一定程度的复杂程度,相当于在不相交应用程序中的两个JVM之间传递信息。开箱即用,它不是以这种方式工作的,因为6中的执行环境不会知道项目硬币的功能。IIRC 你不能在 1.4 运行时中使用泛型,那么这有什么不同呢?归根结底,这似乎真的不值得,然后也许我完全错过了你的观点。


推荐