字节码是否取决于创建它的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插件 编辑:更新了该工具的最新网址