java - 如果我使用最新的 JDK 编译 Java 文件,那么旧的 JVM 是否能够运行 .class 文件?

标签 java jvm

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

最佳答案

If I compiled a java file in the newest JDK, would an older JVM be able to run the .class files?

这取决于三件事:

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

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

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

Does the bytecode depend on the version of the java it was created with?

是的,对上面的点取模。


1 - Java 8 JVMS 声明:“Oracle 在 JDK 版本 1.0.2 中的 Java 虚拟机实现支持类文件格式版本 45.045.3 包括在内。JDK 发布 1.1.* 支持 45.045.65535 范围内的类文件格式版本。对于 k ≥ 2,JDK 版本 1.k 支持 45.044+k.0 范围内的类文件格式版本。"

2 - 反向移植也可能有问题。例如:1) 依赖 native 代码支持的事情很可能需要您实现该 native 代码支持。 2) 当您在旧版 JVM 上运行代码时,您很可能需要将任何后向端口 JAR 文件放到引导类路径中。

关于java - 如果我使用最新的 JDK 编译 Java 文件,那么旧的 JVM 是否能够运行 .class 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4061965/

相关文章:

java - 在运行时更新 JAR

java - 通过Matlab JVM运行时传输到带有00的Java.nio文件?

mysql - 在 RapidMiner 中读取 MYSQL 数据库

java - java读取数据到内存的性能

java - Hibernate Annotations - id 设置不正确

Java 单选按钮变量错误

java - 将 SSL 证书安装到 tomcat 服务器后连接被拒绝

java - -XX :+StressLCM, -XX:+JVM 的 StressGCM 选项

java - 解决/调试 JVM 崩溃的最佳方法 (SIGSEGV)

java - javadoc 和注释中的 Unicode?