字节码是否依赖于用它创建的Java版本?
答案 0 :(得分:41)
如果我在最新的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 JVMS声明:“JDK版本1.0.2
中的Oracle Java虚拟机实现支持类文件格式版本45.0
到45.3
。 JDK在1.1.*
到45.0
范围内发布45.65535
支持类文件格式版本。对于k≥2,JDK版本1.k
支持范围{{范围内的类文件格式版本1}}到45.0
包含。“
2 - 后退也可能有问题。例如:1)依赖本机代码支持的东西很可能需要您实现本机代码支持。 2)当你运行旧JVM上的代码时,你很可能需要将任何后端口JAR文件放到bootclasspath上。
答案 1 :(得分:10)
字节码是否依赖于用它创建的java的版本?
通常是的。但是通过使用-source,-target 和-bootclasspath 选项,可以使用1.7+编译器来创建与Java 1.1兼容的二进制文件
答案 2 :(得分:2)
JVM字节码在主要JVM版本之间向前兼容,但不向后兼容。但是,为了获得最佳信息,您必须阅读JVM发行说明,因为它们通常表明字节码的向后兼容性。
编辑说明,因为这导致了评论中的讨论
JVM字节码是向前兼容的,因此来自一个JVM的字节码与后来的JVM版本兼容。例如,您可以从1.4 JVM获取字节码并在Java 5或Java 6 JVM中运行它(除了安德鲁指出的任何类型的回归问题)。
JVM字节码在JVM之间不向后兼容,因此不能保证来自JVM的字节码在JVM的先前版本中工作,如果您尝试在1.4中运行为Java 6编译的代码的情况。 .2 JVM。
答案 3 :(得分:2)
首先,所有java文件在类头中都有一个版本字节。较旧的jvms不会加载具有较新版本的类,无论它们具有什么功能。
答案 4 :(得分:1)
字节码是否取决于使用它创建的java的版本?
是
如果我在最新的JDK中编译了一个java文件,那么较旧的JVM是否能够运行.class文件?
没有。但相反的情况很有可能。您可能希望看到这个interesting thread,它讨论了向后移植Java。
答案 5 :(得分:1)
不,除非您将旧JVM指定为目标。
例如,使用Java 6,您可以使用以下命令在Java 1.4中编译和运行:
javac -target 1.4 SomeClass.java
显然源代码应该是1.4兼容的。
答案 6 :(得分:0)
如果不使用更高JVM中可用的功能,则可以编译与旧版JVM兼容的类。
javac -target 1.5 MyJava.java
javac -target 1.4 MyJava.java