在Java类文件的字节码版本之间切换

时间:2009-10-01 07:38:04

标签: java jvm bytecode

给定一个带有字节码版本X的Java类文件(ClassName.class)是否有通用的方法将此类文件从字节码版本X表示为字节码版本Y?

假设:

  • 源代码不可用。类文件是该类唯一可用的表示形式。
  • 类文件被严重混淆,因此使用jad或类似的程序反编译该类,然后使用“-target ...”重新编译它不起作用。

首发后更新:

  • 更新#1:此外,假设字节码版本X和字节码版本Y足够接近,以便该类使用的所有指令(当前在字节码版本X中)也存在于版本Y中。

4 个答案:

答案 0 :(得分:3)

对于降级,您可以查看各种方法,以便在Java 1.3 / 1.4中运行Java 5/6代码。请参阅我的回答相关问题Backport Java 5/6 features to Java 1.4?

答案 1 :(得分:2)

您可以使用Apache BCEL

  

字节代码工程库是   旨在为用户提供方便   分析,创造和分析的可能性   操纵(二进制)Java类文件

BCEL使您可以读取给定版本的类文件,对其进行操作,生成新的类文件流,然后使用低级ClassLoader API将其加载到VM中。非常繁琐,毫无疑问,我怀疑这会让你尽可能轻松地降级版本。

答案 2 :(得分:1)

没有。虽然更高版本的Java将能够执行该字节码,但您无法升级它:类文件的更高版本具有不同的格式。

你不能降级它,因为没有办法用旧版Java中的其他结构替换丢失的字节码。

[编辑] IIRC,Sun为每个主要版本的Java添加了至少一个新的字节码指令。这通常是主要Java版本的原因:对字节码的更改。

那就是说,试试运气并更改major version of the class file,看看你的新VM是否会加载它。我怀疑它适用于任何复杂的例子,但你可能很幸运。

答案 3 :(得分:1)

使用retroweaver