我们有一个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())

没有正确的解决方案

其他提示

给贾德(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编译器将“ typeystemholder.class”的表达式转换为getClass存储结果的调用。此初始化发生在每个类引用“ typeystemholder.class”的类中一次,并且编译器替换了每个呼叫的呼叫,该呼叫将其使用该表达式使用字段访问。

大多数反编译器未能将此习语转换回给“ typeystemholder.class”的原始呼叫,但Jad很好地处理了这一点。此外,还有一个将JAD(和其他)集成到Eclipse的插件(http://jadclipse.sourceforge.net).

不幸的是,分解器不能处理编译器生成的每个代码序列,因此始终需要进行一些手动重写。例如,Java编译器可以为一个异常处理块生成代码,该块与代码重叠以作为另一个异常处理块。分解器无法将其分成两个捕获块。在这种情况下,通常会看到整个代码中乱扔垃圾的goto语句(不是有效的Java),或者分解器只是放弃了该方法。

另外,您是正确的,这是生成的代码。具体而言,它来自XMLBEANS编译器,该编译器解析XN XML模式并为Java生成绑定类。允许一个人串行和挑选符合该模式的XML文档。如果您可以访问模式,最好将XMLBEANS纳入您的构建中,而不是将这些课程分解。

看一眼 煤烟. 。它并未对Java源代码进行反编译,而是使用可编译的中间层。虽然它要学习的另一种语言,但您将获得所需的灵活性。

此外,如果您只进行小调整,则只能单独攻击文件并完整保留其余的文件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top