在不同的JRE上运行Java类文件的后果?
在JRE 1.6或者1.5上运行在JDK 1.4.2中编译的Java类文件有什么后果?
解决方案
从理论上讲,什么都没有。 JVM应该向后兼容。我自己,在这方面从未遇到过问题。
完全取决于我们使用的Java库的哪些部分。从"绝对好,没有任何区别"到" OMG"都可以!为什么只是格式化了我的硬盘?' (嗯,也许不是第二个,但是它可以支持它从无到有可能变成坏点的观点:))。
班级也可能会在库中进行错误修复,这意味着小错误会消失(或者可能会引入错误,这取决于我们是否依赖于错误行为)。
但是,AFAIK的Java字节码是向后兼容的,因此我们只要不执行任何操作就不会遇到任何问题。
它应该工作。我不记得它有任何问题,除非Java API的某些部分已过时,否则它将解释它们的含义,我们可以希望编写一个解决方法。
当然,在JRE 1.5中运行用JDK 1.6编译的类文件会引起问题,即使仅旧版本的较小的JRE版本的JRE也会引发错误。
一个积极的结果是1.4类仍将利用对JVM进行速度改进的优势(尽管不必对库类进行改进)。
我自己遇到了这样的问题我正在编写适用于1.6的代码,但该学院安装了1.3. 许多方法就是行不通的,即
input ="" + JOptionPane.showInputDialog(null,"在" +(b?" encrypt":" decrypt")+"。",(b?" 4086":" 5317"))中输入四位数。
不会工作,但是
input ="" + JOptionPane.showInputDialog(null,"在" +(b?" encrypt":" decrypt")+"。"中输入一个四位数的数字。");
将。在1.3中不接受存在三个增量的inputdialog方法。
这只是一个漫长的说法,就是在1.3上使用1.6 api会导致头部撞击事件。
Java类是向前兼容的,例如使用1.5编译器生成的类将成功加载并执行,并且在JRE 1.6上不会出现任何问题。通常,今天的Java编译器生成的类将与将来的JRE兼容(例如Java7)
反之则不成立:我们不能在较旧的JRE(1.3、1.4等)上运行1.6生成的类。
Java编译器指定源和目标合规性级别。这样,我们可以从任何其他更高版本的JRE中编译任何JRE。我们需要确保使用这些合规性级别,因为JRE之间存在API差异。例如,JRE 1.5在编译器级别引入了StringBuilder。这意味着我们可以随时执行以下操作:
String s = "string1" + "string2";
编译器将其更改为:
String s = new StringBuilder("string1").append("string2").toString();
显然,当我们尝试构造StringBuilder时,这会出现NoClassDefFoundError中断。
Java SE 6兼容性页面列出了Jave 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 is upwards binary-compatible with J2SE 5.0 except for the incompatibilities listed below. Except for the noted incompatibilities, class files built with version 5.0 compilers will run correctly in JDK 6.
因此,总的来说,正如workmad3所指出的,在较旧的JDK上编译的Java类文件仍将与最新版本兼容。此外,正如Desty所指出的,通常不建议对API进行任何更改,而不是将其删除。
在"源兼容性"部分中:
Deprecated APIs are interfaces that are supported only for backwards compatibility. The javac compiler generates a warning message whenever one of these is used, unless the -nowarn command-line option is used. It is recommended that programs be modified to eliminate the use of deprecated APIs, although there are no current plans to remove such APIs entirely from the system with the exception of JVMDI and JVMPI.
Java SE 6性能白皮书中列出了很多性能改进。