在不同的JRE上运行Java类文件的后果?

时间:2008-09-22 12:05:06

标签: java java1.4

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

8 个答案:

答案 0 :(得分:6)

Java SE 6 Compatibility页面列出了Jave SE 6与Java SE 5.0的兼容性。此外,还有Incompatibilities in J2SE 5.0 (since 1.4.2)的链接。通过查看这两个文档,应该可以找出在JDK 1.4.2和Java SE 6下编写的程序是否存在任何不可通行性。

就Java类文件的二进制兼容性而言,Java SE 6兼容性页面包含以下内容:

  

Java SE 6向上兼容二进制   用J2SE 5.0除外   incompatibilities列出如下。除了   对于注意到的不兼容性,课程   使用5.0版编译器构建的文件   将在JDK 6中正确运行。

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

来自Source Compatibilities部分:

  

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

Java SE 6 Performance White Paper中有很长一段时间的效果改进。

答案 1 :(得分:5)

Java类与前向兼容,例如使用1.5编译器生成的类将在JRE 1.6上成功加载并执行而没有任何问题。通常,今天java编译器生成的类将与未来的JRE兼容(例如Java7)

反转不成立:你不能在旧的JRE(1.3,1.4等)上运行1.6生成的类。

答案 2 :(得分:1)

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

String s = "string1" + "string2";

编译器将其更改为:

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

显然,当您尝试构造StringBuilder时,这会破坏NoClassDefFoundError。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

完全取决于您使用的java库的哪些部分。它可以是'绝对精细,没有任何区别'到'OMG !!为什么它只是形成了我的硬盘?“ (好吧,也许不是第二个,但它有助于支持它从无到有,可能是坏事:))。

你的班级也可以了解库中的错误修复,这意味着错误消失(或者可能会引入错误,具体取决于你是否依赖于错误的行为)。

但是,

AFAIK,java字节码是向后兼容的,所以你不应该做任何问题而不做任何事情。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

input =“”+ JOptionPane.showInputDialog(null,“输入四位数字到”+(b?“加密”:“解密”)+“。”,(b?“4086”:“5317”) );

无效但

input =“”+ JOptionPane.showInputDialog(null,“输入一个四位数字到”+(b?“加密”:“解密”)+“。”);

会。接受三个agruments的inputdialog方法在1.3中不存在接缝。

这只是一个长篇大论的说法,即在头部砰击事件中使用1.6 api 1.3的结果。

答案 7 :(得分:-2)

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