28

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

4

2 回答 2

8

我没有读过编译器的代码,但是一些新特性显然对字节码有影响。

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

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

“Multi-catch”还生成与以前的任何编译器生成的字节码略有不同。异常表中的多个条目现在将指向同一个 catch 主体。

于 2011-10-01T19:28:30.637 回答
0

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

于 2011-07-14T20:22:39.270 回答