我们有一个Java应用程序,供应商已经不存在了(由于破产)。不幸的是,我们不得不对应用程序的功能进行一些更改,这意味着反向工程JavaEE应用程序。
我们使用JD对大约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())发布于 2010-02-01 11:29:00
让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编译器可能为一个与另一个异常处理块的代码重叠的异常处理块生成代码。反编译器无法将其分离回两个捕获块。在这种情况下,人们通常会看到goto语句散落在代码中(无效的Java),或者反编译器干脆放弃了该方法。
而且,这是生成的代码,这是正确的。具体来说,它来自XmlBeans编译器,它解析XmlBeans并为Java生成绑定类;允许对符合该模式的XML文档进行服务器化和反序列化。如果您能够访问模式,最好将XmlBeans合并到您的构建中,而不是对这些类进行反编译。
发布于 2010-02-09 12:39:15
看看煤烟。它不将代码反编译成Java源代码,而是使用可编译的中间层。虽然这是另一种需要学习的语言,但您将获得所需的灵活性。
此外,如果您只是进行小的调整,您可以只攻击单独的文件,其余的保持原封不动。
https://stackoverflow.com/questions/2145840
复制相似问题