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

Java JRE版本必须等于或高于JDK版本?,java,compilation,jvm,bytecode,backwards-compatibility,Java,Compilation,Jvm,Bytecode,Backwards Compatibility,我已经读到JDK生成的字节码是通用的。我想说的是,他们只做内存映射、调用等事情。。。所以如果这是真的,那就意味着我可以,例如,如果我编写一个具有JDK1.7特性的程序,我就不需要担心它是否可以在一个使用JRE1.6的用户中运行?(这是一个例子,它可能发生在更严重的情况下) 所以,我的问题是:我能用1.7中的新东西编写一个程序并在1.6中运行吗 我能用1.7中的新东西编写一个程序并在1.6中运行吗 不。Java不向后兼容 请注意,可以使用创建与1.7 JDK中的Java 1.6 JRE兼容的代码,

我已经读到JDK生成的字节码是通用的。我想说的是,他们只做内存映射、调用等事情。。。所以如果这是真的,那就意味着我可以,例如,如果我编写一个具有JDK1.7特性的程序,我就不需要担心它是否可以在一个使用JRE1.6的用户中运行?(这是一个例子,它可能发生在更严重的情况下)

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

我能用1.7中的新东西编写一个程序并在1.6中运行吗

不。Java不向后兼容

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

我能用1.7中的新东西编写一个程序并在1.6中运行吗

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

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

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


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

不幸的是,javac拒绝将java7编译成50.0版。但您始终可以自己手动或使用工具更改字节码版本字段。因为没有新的字节码特性,所以它可以正常工作


虚拟机关闭了内存映射。它没有字节码指令。但是你的想法是对的。

不是。字节码或类有一个版本限制它们。这意味着Java6不能读取/执行Java7编译的类。这可以防止Java 7中的功能在Java 6及以下版本中根本不可用的问题。您可以使用Java 7为Java 6生成“兼容”类,但这将消除在代码中使用Java 7功能的可能性您感兴趣的是什么特定的“新事物”?有很多,例如NIO2…“我读到JDK生成的字节码是通用的。”我想您不明白这意味着什么,或者,从你读过的地方再也不要读任何东西了。@MadProgrammer至少有一些丑陋的黑客“幸运的是,51.0版实际上没有引入Java使用的任何新字节码功能。”。这是完全错误的。事实上,整个答案都不正确。@Brian您认为它增加了哪些新功能?因为Java不使用InvokedDynamic。不必在意。这个说法仍然是错误的。除此之外,更确切地说,告诉别人没有区别,显然这是出于“未知的原因”,他们可能会破解二进制文件,也许他们会使用一个8年前的JVM版本,这个版本已经被Oracle下线了。。。我们还是坚持现实世界的答案吧,不,布莱恩,我很困惑。如果你不知道也不在乎答案,你怎么能如此肯定我是错的?不管怎么说,现实世界的答案是,如果你真的愿意,你可以让它工作,但它没有官方支持,需要一些二进制黑客。如果我错了,我想听听为什么,这样我就可以学习新的东西。但是,仅仅声称我错了,而不提供任何证据或解释你认为错的是没有帮助的。