如果我在最新的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版本Oracle的Java虚拟机实现1.0.2
支持类文件格式版本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文件放入bootclasspath中。



