修复编译版本

时间:2015-05-12 01:07:58

标签: java classloader

我看了一眼,找不到我问题的具体答案,所以我正在制作一个新答案。

因此,我正在寻找一个正式无法控制的问题的解决方案,但如果有任何我可以尝试修复的问题,那就太棒了。

原因是一些正在加载的类是用户提供的,并且没有使用最低兼容版本的java正确编译,因此它会导致不可预测的java要求。

当然,只有在必要时才会这样做,但如果没有加载该java版本,请尝试修补标记的java版本,以便它无论如何都会尝试。

基本上我正在尝试纠正(如果可能的话)在java字节代码上标记的所述编译版本,以便理想情况下不会抛出不兼容的java版本错误,即使它们通常会抛出,如果代码可以成功地最初编译在较低的java版本。

基本上,除了提供的可能缺少的内置库之外,我不确定编译器在不同版本之间是否有非常不同的字节码。如果是这种情况,那么这样的事情无论如何都无法发挥作用。

欣赏它,jdphenix,这是我需要知道的。

对不起我在这里做错了什么来获得反对票。

3 个答案:

答案 0 :(得分:2)

不幸的是,Java类文件只能向前兼容。因此,针对较新版本的类文件无法运行系统的JVM。

主要版本之间存在重大变化。例如,我在脑海中可以想到的是Java 5中的变量和泛型。

答案 1 :(得分:1)

不幸的是,字节码实际上太不同了。标记在该类上的版本是必不可少的,如果这不正确将无法正常工作。遗憾的是,它无法以这种方式修复,因此在这方面你会受到其他人的支配。

答案 2 :(得分:0)

在类加载阶段,JVM进行字节码验证。在类文件中,它将获得有关它编译的Java版本的信息,这有助于JVM找出试图进一步加载和执行的当前Java版本。类文件是向后兼容的,你可以在java 5上编译,并且可以在更高版本中运行,反之亦然,因为上述验证。字节代码可以注入已经存在的类文件,但如果未正确注入,则应用程序可能会遇到一些异常执行。