首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反编译JavaEE

反编译JavaEE
EN

Stack Overflow用户
提问于 2010-01-27 09:54:00
回答 2查看 702关注 0票数 3

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

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

然而,因为它们是由代码生成器产生的,所以这些支座的构建并不容易?我可以用什么工具来进一步协助?

编辑:

这是困难的一个例子:

代码语言:javascript
复制
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 }));

很难知道什么是

代码语言:javascript
复制
class$schema$system$s322D2AAD7A06BA82525CDB874D86D59A$TypeSystemHolder.getClassLoader())
EN

回答 2

Stack Overflow用户

发布于 2010-02-01 11:29:00

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

您显示的有问题的代码相当于以下内容:

代码语言:javascript
复制
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合并到您的构建中,而不是对这些类进行反编译。

票数 4
EN

Stack Overflow用户

发布于 2010-02-09 12:39:15

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2145840

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档