在JRE 1.6或1.5上运行在JDK 1.4.2中编译的Java类文件有什么后果?
答案 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的任何更改通常都会被弃用而不是删除。
不推荐使用的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只有较小的构建版本,也会引发错误。