2

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

假设:

  • 源代码不可用。类文件是类的唯一可用表示。
  • 类文件被严重混淆,所以用说 jad 或类似程序反编译类,然后用“-target ...”重新编译它是行不通的。

初次发帖后的更新:

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

4 回答 4

3

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

于 2009-10-01T08:21:22.263 回答
2

你可以使用Apache BCEL

字节码工程库旨在为用户提供方便的可能性来分析、创建和操作(二进制)Java 类文件

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

于 2009-10-01T07:40:50.130 回答
1

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

您也不能降级它,因为在旧版本的 Java 中无法用其他构造替换丢失的字节码。

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

也就是说,试试你的运气并更改类文件的主要版本,看看你的新 VM 是否会加载它。我怀疑它是否适用于任何复杂的例子,但你可能很幸运。

于 2009-10-01T07:41:08.773 回答
1

使用逆向编织器

于 2009-11-19T16:33:35.663 回答