Java 在JVM 5或更低版本上运行JVM 6编译代码

Java 在JVM 5或更低版本上运行JVM 6编译代码,java,Java,在JVM版本6上执行编译成字节码的类,并在较低版本的JVM(比如1.4)上执行相同的类,会有什么影响?不确定您真正要问的是什么,但如果您编译一个针对Java 6的Java源文件,它将不会在较旧的JVM(比如1.4)上执行 然而,正如@The MeLLeR所指出的,您仍然可以使用1.6编译器通过使用-target选项编译成1.4兼容的代码。但是请记住,只有在不使用任何1.5/1.6特定功能或API类的情况下,这才有效 例如,如果您尝试编译一个for each循环,使用-target 1.4,您将

在JVM版本6上执行编译成字节码的类,并在较低版本的JVM(比如1.4)上执行相同的类,会有什么影响?

不确定您真正要问的是什么,但如果您编译一个针对Java 6的Java源文件,它将不会在较旧的JVM(比如1.4)上执行


然而,正如@The MeLLeR所指出的,您仍然可以使用1.6编译器通过使用
-target
选项编译成1.4兼容的代码。但是请记住,只有在不使用任何1.5/1.6特定功能或API类的情况下,这才有效

例如,如果您尝试编译一个for each循环,使用
-target 1.4
,您将得到类似以下消息:

Test.java:3: ';' expected
        for (int i : new int[] { 1, 2, 3 })
                   ^

除非使用-target命令行选项编译,否则它不会在旧的JVM上运行


当使用-target选项编译时,编译的类应该在较旧(但不是比[target]旧)的jvm上运行100%相等。

如果您尝试使用为当前jvm支持的较新jvm编译的类,jvm将在尝试加载该类时抛出
UnsupportedClassVersionError
。较新的类格式可能具有旧JVM不支持的特性,因此这是必要的

可以使用javac的
-target
选项使较新的JDK使用较旧的类格式生成类。但是您仍然需要小心,不要使用仅存在于较新JRE上的类或方法,否则JVM将在类加载时抛出一些错误。使用与目标版本相同的JDK版本是最安全的选择


p.S.IntelliJ IDEA有一个检查警告,如果您使用了太新的方法/类。还有一个名为在Java 1.4上运行Java 5代码的工具。

JVM不编译代码,但如果您需要将target用作Java 6并尝试运行w/jdk1.4,则可能会出现验证错误和/或NoClassDefFounError等。Java仅向后兼容。除非使用--target;)编译)您仍然可以使用--target 1.4为每个循环编译,它是--source 1.4,这将引发上面的错误。上面的消息是在我的机器上使用
-target
生成的。@jmg:如果不使用-source 1(显式或隐式),您就不能使用-target 1.4。4@Michael嗯,我不知道。但是,正如Esko Luontola所指出的那样,您仍然可以使用Retroweaver来实现同样的功能。但是,如果您使用旧版JRE中缺少的部分标准API,编译后的程序在运行时仍然可能失败。
Test.java:3: ';' expected
        for (int i : new int[] { 1, 2, 3 })
                   ^