【问题标题】:Consequences of running a Java Class file on different JREs?在不同的 JRE 上运行 Java 类文件的后果?
【发布时间】:2008-09-22 12:05:06
【问题描述】:

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

【问题讨论】:

    标签: java java1.4


    【解决方案1】:

    Java SE 6 Compatibility 页面列出了 Java 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 中有很长的性能改进列表。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        String s = "string1" + "string2";
        

        编译器将其更改为:

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

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

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

            【讨论】:

              【解决方案6】:

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

              【讨论】:

                【解决方案7】:

                我自己也遇到了这样的问题。我正在编写应该与 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 会导致头部撞击事件。

                【讨论】:

                • 嘿 :) 当然。能够做到这一点需要 1.3 向前兼容,我从来没有遇到过成功的 API(毕竟,如果它的功能与旧版本相同,那么编写新版本有什么意义?:))
                【解决方案8】:

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-05-14
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-06-15
                  • 2021-02-16
                  • 1970-01-01
                  相关资源
                  最近更新 更多