当前位置: 首页 > 面试题库 >

如果我使用最新的JDK编译Java文件,那么较早的JVM是否可以运行.class文件?

姬魁
2023-03-14
问题内容

字节码是否取决于创建它的Java版本?


问题答案:

如果我在最新的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中。



 类似资料:
  • 问题内容: 我正在尝试调试 “ .class文件中的版本号错误” java中的错误,有没有办法让我检查文件的版本? 我正在使用,但我的版本是1.6.0_13。 我正在以eclipse设置为1.5的兼容模式进行编译,我认为这是可行的… 问题答案: 你正在命令行(针对名为MyClass的类)中寻找以下内容: 在Unix / Linux上: 在Windows上: 你需要结果中的主要版本。以下是一些示例值

  • 问题内容: 这可能是一个愚蠢的问题,但是在运行以Java 1.6 和 1.7 版编译的Java程序和相关库(我使用1.7进行编译,而某些库是使用1.6进行编译)并在1.7 JRE中运行整个程序时,我会遇到任何问题? 问题答案: 您不会遇到任何问题-这就是Java的魔力-它是向后兼容的。您几乎可以在Java 8上运行Java 1中的所有代码。没有理由不能在Java 8 Runtime上运行Java

  • 这可能是一个愚蠢的问题,但我会遇到任何问题运行Java程序和相关的库编译Java版本1.6和1.7(我编译使用1.7而一些库编译使用1.6)和运行整个程序在1.7的JRE里?

  • 我是一名具有强大C背景的程序员,但对Java世界很陌生。现在我有一个关于调试的问题。 如何使用Eclipse IDE调试预编译Java. class文件?我发现通过谷歌搜索找到答案并不容易。 为了使我的问题准确无误,我将其阐述如下。 我在下面有两个.java源文件: 在根文件夹($)中,我可以使用两个命令编译并运行: 现在我有其中有Java字节代码。 那么如何在上进行源代码级调试呢? 我试过了,但

  • 问题内容: 如何确定是否已使用调试信息编译任何Java .class文件? 我怎样才能准确地知道使用了什么-g {source | lines | vars}选项? 问题答案: 如果在命令行上,则javap -l将显示LineNumberTable和LocalVariableTable(如果存在): 将在反编译开始时显示源文件: 以编程方式,我将研究ASM,而不是编写另一个字节码读取器。

  • 问题内容: 如何批量反编译许多类文件? 问题答案: JD-Gui使您的生活变得轻松,它还具有一个eclipse插件 编辑:更新了该工具的最新网址