3

在 JRE 1.6 或 1.5 上运行用 JDK 1.4.2 编译的 Java 类文件有什么后果?

4

8 回答 8

6

Java SE 6 兼容性页面列出了 Java SE 6 与 Java SE 5.0 的兼容性。此外,还有一个指向J2SE 5.0(自 1.4.2 起)中的不兼容性的链接。通过查看这两个文档,应该可以找出在 JDK 1.4.2 和 Java SE 6 下编写的程序是否存在不兼容问题。

在 Java 类文件的二进制兼容性方面,Java SE 6 兼容性页面有以下说法:

Java SE 6 与 J2SE 5.0 向上二进制兼容,除了 下面列出的不兼容性。除了提到的不兼容性之外,使用 5.0 版编译器构建的类文件将在 JDK 6 中正确运行。

因此,一般来说,正如workmad3 所指出的,在旧 JDK 上编译的 Java 类文件仍将与最新版本兼容。此外,正如Desty所指出的,对 API 的任何更改通常都会被弃用而不是被删除。

源兼容性部分:

不推荐使用的 API 是仅支持向后兼容的接口。每当使用其中之一时,javac 编译器都会生成一条警告消息,除非使用了 -nowarn 命令行选项。建议修改程序以消除对已弃用 API 的使用,尽管目前没有计划从系统中完全删除此类 API,但 JVMDI 和 JVMPI 除外。

Java SE 6 性能白皮书中有很长的性能改进列表。

于 2008-09-22T12:31:40.827 回答
5

Java 类是前向兼容的,例如使用 1.5 编译器生成的类将在 JRE 1.6 上成功加载和执行而不会出现任何问题。一般来说,今天的 java 编译器生成的类将与未来的 JRE 兼容(例如 Java7)

反过来不成立:您不能在较旧的 JRE(1.3、1.4 等)上运行 1.6 生成的类。

于 2008-09-22T12:28:28.867 回答
1

Java 编译器指定源和目标合规级别。这样,您可以从任何其他更高版本的 JRE 编译任何 JRE。您需要确保使用这些合规级别,因为 JRE 之间存在 API 差异。例如,JRE 1.5 在编译器级别引入了 StringBuilder。这意味着任何时候你这样做:

String s = "string1" + "string2";

编译器将其更改为:

String s = new StringBuilder("string1").append("string2").toString();

显然,当您尝试构造 StringBuilder 时,这将因 NoClassDefFoundError 而中断。

于 2008-09-22T12:30:38.753 回答
0

理论上,没什么。JVM 应该是向后兼容的。我自己,在那个方向上我从来没有遇到过问题。

于 2008-09-22T12:08:08.900 回答
0

完全取决于您使用的 java 库的哪些部分。它可以是从“绝对没问题,没有任何区别”到“天哪!!为什么它刚刚格式化了我的硬盘??(好吧,也许不是第二个,但它有助于支持它从无到有可能变得糟糕 :))。

您的课程也可以在库中修复错误,这意味着琐碎的错误会消失(或者可以根据您是否依赖错误行为来引入)。

AFAIK 虽然,java 字节码是向后兼容的,所以你不应该遇到任何问题,只是什么都不做。

于 2008-09-22T12:09:13.623 回答
0

一个积极的结果是 1.4 类仍将利用对 JVM 的速度改进(尽管对库类没有必要的改进)。

于 2008-09-22T12:11:18.940 回答
0

我自己也遇到了这样的问题。我正在编写应该与 1.6 一起使用的代码,但学院安装了 1.3。很多方法都行不通,即

input = ""+ JOptionPane.showInputDialog(null,"输入一个四位数字到" + (b?"encrypt":"decrypt")+".",(b?"4086":"5317"));

行不通,但是

input = ""+ JOptionPane.showInputDialog(null,"输入一个四位数字到" + (b?"encrypt":"decrypt")+".");

将。接受三个参数的 inputdialog 方法在 1.3 中并不存在。

这只是说在 1.3 上使用 1.6 api 会导致头部撞击事件。

于 2008-09-22T12:21:23.987 回答
-2

它应该工作。我不记得遇到过任何问题,除非 Java API 的某些部分已被弃用,在这种情况下,它会解释它们是什么,您可以希望编写一个解决方法。当然,在 JRE 1.5 中运行使用 JDK 1.6 编译的类文件会导致问题——即使是 JRE 仅较小的构建版本较旧也会引发错误。

于 2008-09-22T12:10:52.450 回答