给定一个字节码版本 X 的 Java 类文件 (ClassName.class),是否有一种通用方法可以将该类文件从字节码版本 X 中表示为字节码版本 Y 中表示?
假设:
- 源代码不可用。类文件是类的唯一可用表示。
- 类文件被严重混淆,所以用说 jad 或类似程序反编译类,然后用“-target ...”重新编译它是行不通的。
初次发帖后的更新:
- 更新#1:此外,假设字节码版本 X 和字节码版本 Y 足够接近,因此类使用的所有指令(当前在字节码版本 X 中)也存在于版本 Y 中。
对于降级,您可以查看使 Java 5/6 代码在 Java 1.3/1.4 中运行的各种方法。请参阅我对相关问题 Backport Java 5/6 features to Java 1.4 的回答?
你可以使用Apache BCEL
字节码工程库旨在为用户提供方便的可能性来分析、创建和操作(二进制)Java 类文件
BCEL 使您可以读取给定版本的类文件,对其进行操作,生成新的类文件流,然后使用低级ClassLoader
API 将其加载到 VM 中。毫无疑问,非常繁琐,我怀疑这会让您像升级一样轻松地降级版本。
不可以。虽然更高版本的 Java 将能够执行该字节码,但您无法升级它:更高版本的类文件具有不同的格式。
您也不能降级它,因为在旧版本的 Java 中无法用其他构造替换丢失的字节码。
[编辑] IIRC,Sun 为 Java 的每个主要版本添加了至少一条新的字节码指令。这通常是主要 Java 版本的原因: 字节码的更改。
也就是说,试试你的运气并更改类文件的主要版本,看看你的新 VM 是否会加载它。我怀疑它是否适用于任何复杂的例子,但你可能很幸运。
使用逆向编织器