我们有一个Java EE应用程序,该供应商不再存在(由于破产)。不幸的是,我们必须对应用程序的功能进行一些更改,这意味着对JavaEE应用程序进行逆向工程。
我们使用JD-GUI对大约70%的app / classes进行反向工程,然后手动调整它们以在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())
答案 0 :(得分: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合并到您的构建中,而不是反编译这些类。
答案 1 :(得分:0)
看看soot。它不会反编译为Java源代码,而是使用可编译的中间层。虽然它是另一种学习语言,但您将获得所需的灵活性。
此外,如果您只是进行小的调整,您可以单独攻击文件并保持其余部分不变。