如果我用最新的JDK编译了一个Java文件,那么旧的JVM能够运行.class文件吗?

如果我用最新的JDK编译了一个Java文件,那么旧的JVM能够运行.class文件吗?,java,jvm,Java,Jvm,字节码是否依赖于它创建时使用的Java版本?JVM字节码在主要JVM版本之间是向前兼容的,但不向后兼容。但是,为了获得最佳信息,您必须阅读JVM发行说明,因为它们通常指示字节码的向后兼容程度 编辑澄清,因为这引起了评论中的讨论 JVM字节码是向前兼容的,因此来自一个JVM的字节码与以后的JVM版本兼容。例如,您可以从1.4JVM获取字节码,并在Java5或Java6JVM中运行它(除了Andrew指出的任何类型的回归问题) JVM字节码在JVM之间不向后兼容,因此JVM的字节码不能保证在JVM的

字节码是否依赖于它创建时使用的Java版本?

JVM字节码在主要JVM版本之间是向前兼容的,但不向后兼容。但是,为了获得最佳信息,您必须阅读JVM发行说明,因为它们通常指示字节码的向后兼容程度

编辑澄清,因为这引起了评论中的讨论


JVM字节码是向前兼容的,因此来自一个JVM的字节码与以后的JVM版本兼容。例如,您可以从1.4JVM获取字节码,并在Java5或Java6JVM中运行它(除了Andrew指出的任何类型的回归问题)


JVM字节码在JVM之间不向后兼容,因此JVM的字节码不能保证在JVM的早期版本中工作,如果您试图在1.4.2 JVM中运行为Java 6编译的代码,情况就是这样。

首先,所有Java文件的类头中都有一个版本字节。较旧的JVM不会加载具有较新版本的类,无论它们具有哪些功能。

字节码是否取决于它创建时使用的java版本?

如果我用最新的JDK编译了一个java文件,旧的JVM能运行.class文件吗?

不,但很可能相反。您可能想看看这个,它谈到了Java的后移植

字节码是否取决于它创建时使用的java版本

通常是的。但是通过使用-source、-target和-bootclasspath选项,1.7+编译器可以用来创建与Java1.1兼容的二进制文件

如果我用最新的JDK编译了一个java文件,旧的JVM是否能够运行.class文件

这取决于三件事:

  • 您正在谈论的实际Java版本。例如,1.4.0 JVM可以运行由1.4.2编译器编译的代码,但1.3.x JVM不能运行1

  • 使用的编译标志。有一个
    -target
    编译器标志,告诉它生成将在旧的(目标)JVM上运行的代码。而
    -source
    编译器标志告诉它只接受旧版JVM的语言特性。(这种方法并不总是有效的,这取决于代码使用的Java语言特性。但是如果代码编译,它应该可以工作。)

  • 类文件使用的库类。如果它使用旧类库中不存在的库类,那么它将不会运行。。。除非您可以包含一个支持类2的JAR。通过使用
    -bootclasspath
    选项根据旧版本Java的API编译代码,可以避免此问题

字节码是否取决于它创建时使用的java版本

是的,对上面的点进行模化


1-Java 8 JVM声明如下:“Oracle在JDK发行版
1.0.2
中的Java虚拟机实现支持类文件格式版本
45.0
45.3
。JDK发布的
1.1.*
支持
45.0
45.65535
范围内的类文件格式版本。为了k≥ 2、JDK发行版
1.k
支持
45.0
44+k.0
范围内的类文件格式版本


2-后端口也可能有问题。例如:1)依赖于本机代码支持的东西很可能需要您实现该本机代码支持。2)在较旧的JVM上运行代码时,您很可能需要将任何后端口JAR文件放到bootclass路径上。

您可以编译较旧版本的类如果不使用更高JVM中可用的功能,则可以使用n个JVM兼容

javac-target1.5myjava.java

javac-target1.4myjava.java


否,除非指定旧JVM作为目标

使用Java 6,您可以使用以下工具在Java 1.4中编译和运行:

javac -target 1.4 SomeClass.java

显然,源代码应该是1.4兼容的。

@Birrree:新版本是向后兼容的。旧版本不是向前兼容的。这会更有意义,你怎么说?@Adeel:我想说你的评论毫无意义。在Java 1.1中创建的小程序应该在Java 1.6中运行良好,除非出现回归错误。@Andrew:我是说我说的完全一样。我说的有什么不同吗?新版本是向后兼容的,这意味着1.1小程序在1.6中应该运行得很好。@Adeel“1.1小程序在1.6中应该运行得很好”是我相信大家都同意的(已经提到了一些小的警告),但Birrree的话在我看来可能是这样的,而你的说法恰恰相反。至少就我的理解而言!我们还是坚持“1.1小程序在1.6中应该运行得很好”怎么样“为了避免混淆?;)@安德鲁:你让我开始怀疑自己的判刑。是的,我们应该坚持你的建议。这里的问题是,我不是以英语为母语的人,所以你可能是对的请注意,JDK 1.8表示不推荐为目标1.5编译,JDK 1.9将完全删除目标1.5支持:……但是,在JDK 1.9上,为旧版本编译更容易,因为不需要bootclasspath: