java 7的java字节码将在其他版本的Java中工作

时间:2013-03-12 01:26:15

标签: java

我只是想知道在一个版本的java中生成的字节码是否适用于其他版本的java

2 个答案:

答案 0 :(得分:10)

通常,字节码将在较新的版本的Java上运行而无需修改。除非使用特殊参数(javac -target)对其进行编译,否则它不会在旧版本上运行,并且要特别注意不要使用新的库类。

答案 1 :(得分:3)

二进制兼容性

根据JVM规范,Java SE 7的类文件版本为51,因为JSR 292引入了invokedynamic字节代码.Java SE 7编译器生成的版本51类文件不能在Java SE 6中使用。

Java SE 7与Java SE 6二进制兼容,但incompatibilities除外。除了指出的不兼容性之外,使用Java SE 6编译器构建的类文件将在Java SE 7中正确运​​行。

朋友的话......
编译器不向后兼容,因为使用Java7 JDK生成的字节码不能在Java 1.6 jvm中运行(除非使用-target 1.6标志进行编译)。但是JVM是向后兼容的,因为它可以运行较旧的字节码。

所以他们选择从javac的角度考虑兼容性(因为它是JDK特有的部分),这意味着生成的字节码可以在jvm的未来版本中运行(这与jvm的更多相关) JRE,但也捆绑在JDK中。)

简而言之,我们可以说:

JDK's are (usually) forward compatible.
JRE's are (usually) backward compatible.

Java表示

交叉编译选项

默认情况下,类是根据javac附带的平台的引导程序和扩展类编译的。但javac还支持交叉编译,其中类是针对不同Java平台实现的引导程序和扩展类编译的。交叉编译时使用-bootclasspath和-extdirs非常重要;请参阅下面的交叉编译示例。

-target version
    Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier versions of the VM. Valid targets are 1.1, 1.2, 1.3, 1.4, 1.5 (also 5), 1.6 (also 6), and 1.7 (also 7).

    The default for -target depends on the value of -source:

        If -source is not specified, the value of -target is 1.7
        If -source is 1.2, the value of -target is 1.4
        If -source is 1.3, the value of -target is 1.4
        If -source is 1.5, the value of -target is 1.7
        If -source is 1.6, the value of -target is 1.7
        For all other values of -source, the value of -target is the value of -source.

-bootclasspath bootclasspath
    Cross-compile against the specified set of boot classes. As with the user class path, boot class path entries are separated by colons (:) and can be directories, JAR archives, or ZIP archives. 

有关交叉编译的更多信息,请参阅 http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#crosscomp-options

比我好 http://www.oracle.com/technetwork/java/javase/compatibility-417013.html