Java 将字节码转换为使用不同的JRE运行

Java 将字节码转换为使用不同的JRE运行,java,bytecode,Java,Bytecode,有没有一种方法可以将使用某个JDK版本从一个供应商生成的类转换为另一个供应商的类,而无需对它们进行反编译?操作系统保持不变。Java X编译器生成的所有类文件都将与Java X、X+1、X+2等JVM兼容。因此,唯一的问题是,您是否可以使它与编译之前的JVM兼容 这样做的难度取决于类文件版本中引入的新特性以及编译器使用它们的一致性。在51.0版(对应于Java7)的情况下,很容易回到50.0版(Java6)。51.0中引入的唯一新特性是InvokedDynamic支持,因此除非编译器使用它,否则

有没有一种方法可以将使用某个JDK版本从一个供应商生成的类转换为另一个供应商的类,而无需对它们进行反编译?操作系统保持不变。

Java X编译器生成的所有类文件都将与Java X、X+1、X+2等JVM兼容。因此,唯一的问题是,您是否可以使它与编译之前的JVM兼容

这样做的难度取决于类文件版本中引入的新特性以及编译器使用它们的一致性。在51.0版(对应于Java7)的情况下,很容易回到50.0版(Java6)。51.0中引入的唯一新特性是InvokedDynamic支持,因此除非编译器使用它,否则只需更改类文件中的版本号即可。标准的javac不使用invokedynamic,尽管可以想象有另一种编译器可以使用


请注意,标准库也会因版本而异。使用Java 7中的“资源试用”功能的代码在Java 6 JVM上不起作用,因为它需要库支持。

如果编译器遵循规范,字节码应该与任何兼容的JVM兼容。实际上,编译器对字节码进行的优化很少,所以一般来说,它们不会有很大的不同。您期望/体验字节码中的具体差异是什么?@MarkPeters我想他问的是,是否有一种方法可以将用Java 7编译的类转换为Java 6,这样就可以用Java 6运行,而无需对该类进行反编译并将编译器符合性设置为Java 6.Right进行重新编译。除非有人自己开发了一个奇怪的Java C实现,否则N版的Java字节码应该总是在N+1、N+2、N+3版上运行……这与供应商完全无关——所有拥有“Java”的供应商(™)" 实现需要通过相同的认证。@Mark Peters:我不确定确切的区别,因此提出了这个问题。Kevin Workman:JDK版本(至少是主要版本)是相同的。