3

我们有一个供应商不再存在的 Java EE 应用程序(由于破产)。不幸的是,我们必须对应用程序的功能进行一些更改,这意味着对 JavaEE 应用程序进行逆向工程。

我们使用 JD-GUI 对大约 70% 的应用程序/类进行逆向工程,然后手动调整它们以在 Eclipse 中构建。

然而,其余部分并不那么容易构建,因为它们是由代码生成器生成的?我可以使用哪些工具来进一步提供帮助?

编辑:

这是困难的一个例子:

return ((SchemaTypeSystem)Class.forName(
    "org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl",
    true,
    class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder.getClassLoader())
        .getConstructor(new Class[] { Class.class })
        .newInstance(new Object[] { TypeSystemHolder.class }));

很难知道什么是

class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder.getClassLoader())
4

2 回答 2

4

试试JAD ( http://www.varaneckas.com/jad )。

您显示的有问题的代码等效于以下内容:

1) Class class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder;
2) ClassLoader loader = class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder.getClassLoader();
3) Class type = Class.forName("org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl", true, loader);
4) Constructor ctor = type.getConstructor(Class.class);
5) Object obj = ctor.newInstance(TypeSystemHolder.class);
6) SchemaTypeSystem result = (SchemaTypeSystem) obj;
7) return result;

您遇到问题的部分是第 1 行,它表示局部变量或字段(可能是静态的)。Java 编译器将表达式“TypeSystemHolder.class”转换为对 getClass 的调用,将结果存储在静态字段中。此初始化在每个引用“TypeSystemHolder.class”的类中发生一次,编译器将使用该表达式的每个调用站点替换为字段访问。

大多数反编译器无法将此惯用语转换回对“TypeSystemHolder.class”的原始调用,但 JAD 处理得很好。此外,还有一个将 JAD(和其他)集成到 Eclipse 中的插件(http://jadclipse.sourceforge.net)。

不幸的是,反编译器不能处理编译器生成的每个代码序列,因此总是需要一些手动重写。例如,Java 编译器可以为一个异常处理块生成与另一异常处理块的代码重叠的代码。反编译器无法将其分离回两个 catch 块。在这种情况下,通常会看到 goto 语句散布在整个代码中(不是有效的 Java),或者反编译器只是放弃了该方法。

此外,您是正确的,这是生成的代码。具体来说,它来自 XmlBeans 编译器,它解析 xn XML Schema 并为 Java 生成绑定类;允许对符合该模式的 XML 文档进行序列化和反序列化。如果您有权访问架构,最好将 XmlBeans 合并到您的构建中,而不是反编译这些类。

于 2010-02-01T11:29:00.267 回答
0

看看烟灰。它不会反编译成 Java 源代码,而是使用可编译的中间层。虽然它是另一种要学习的语言,但您将获得所需的灵活性。

此外,如果您只是进行小的调整,您可以单独攻击文件,其余部分保持不变。

于 2010-02-09T12:39:15.973 回答