JRE版本必须等于或高于JDK版本?

时间:2014-01-18 01:49:16

标签: java compilation jvm bytecode backwards-compatibility

我读过JDK生成的字节码是通用的。我说的是他们只做内存映射,调用等事情......所以如果这是真的,那就意味着我可以,例如,如果编写一个具有JDK 1.7特性的程序,我不会#39;是否需要担心它是否可以在拥有JRE 1.6的用户中运行? (这是一个例子,它可能发生在更多爆炸案件中)。

所以,我的问题是:我可以用1.7中的新东西编写一个程序并在1.6中运行它吗?

2 个答案:

答案 0 :(得分:7)

  

我可以用1.7中的新东西编写程序并在1.6中运行吗?

没有。 Java不向后兼容。

请注意,可以使用cross-compilation options在1.7 JDK中创建与Java 1.6 JRE兼容的代码,但该代码只能使用1.6版中提供的类,属性,方法和语言功能。

答案 1 :(得分:1)

  

我可以用1.7中的新东西编写程序并在1.6中运行吗?

简短的回答是肯定的,但它没有得到官方的支持。你将不得不诉诸一些黑客,但如果你真的想要,你可以让它工作。我不建议在一个重大项目中这样做。

通常,字节码不向后兼容,因为每个类文件都包含一个版本字段。 JVM将拒绝运行具有比其构建版本更高版本的类(较低版本当然可以)。默认情况下,Java 7附带的javac将创建版本为51.0的类,这意味着它们只能由Java 7或更高版本附带的JVM执行。

然而,这并不意味着如果你真的想要创建Java 6兼容代码是不可能的。您可以告诉编译器生成具有早期版本的类文件。所有这些意味着您将无法使用新版本中引入的库和字节码级别功能。

幸运的是,版本51.0实际上没有引入javac使用的任何新字节码功能。 Java 7中的所有新功能都是在编译时实现的 - 除了版本之外,字节码没有任何不同!这意味着只要不依赖于标准库更新,任何Java 7类都可以工作(例如,Try With Resources需要库支持)。

不幸的是,javac拒绝将Java 7编译为50.0版。但您可以自己手动或使用工具更改字节码版本字段。由于没有新的字节码功能,它可以正常工作。

P.S。内存映射由VM关闭。它没有字节码指令。但是你有正确的想法。