【问题标题】:Compiling a Java file out of context脱离上下文编译 Java 文件
【发布时间】:2014-05-12 02:13:27
【问题描述】:

我有一个包含大量包和类文件的大型预编译项目。我提取了其中一个类文件并对其进行了反编译并编辑了其中的一些代码。现在我想编译更改的代码并将其重新插入到原来的预编译项目中,但不幸的是,代码在预编译项目中保留了许多对对象的引用,所以如果没有它已经在项目中,我就无法编译这造成了一个相当大的悖论。我有什么可以做的吗?

【问题讨论】:

    标签: java jar package decompiling


    【解决方案1】:

    只需使用引用现有类文件(或包含这些类文件的 jar 文件)的类路径编译它。应该没有问题。

    但是,请注意,如果您更改文件中的任何常量,这些更改不会反映在引用这些常量的任何其他代码中。

    从完整的源代码重新编译通常会更好。使用原始源代码也比仅使用反编译结果更好——您无法访问原始源代码吗? (如果你不这样做,你确定你所做的事情在你的国家是合法的吗?我不是律师,但你至少应该检查一下......)

    【讨论】:

    • 不,我无权访问原始源代码。不要害怕,它仅用于教育目的:)
    • @JohnDoe:“教育目的”并不意味着某些事情是合法的,甚至不一定是道德的。在继续之前要仔细考虑——还要问问自己原作者是否希望你按照你的计划去做。如果他们愿意,也许他们已经提供了源代码。如果他们不愿意,你真的愿意违背他们的意愿吗?
    【解决方案2】:

    我会重新编译整个东西以避免出现问题,但如果你必须,试试这个,让我知道它们是否适合你:

    不要在原始项目中加载该类,而是使用 classForName http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html 加载它

    请记住,您不能更改方法的签名,因为这将指示不同的对象,因为它不会遵循相同的合同(接口)。

    还要记住 serialVersionId What is a serialVersionUID and why should I use it?

    【讨论】:

    • 你是说我可以使用 hte classForName 方法从 jar 中加载类,然后只要我不更改任何签名,就可以在其中一个方法中更改某些内容?
    • 关闭,但不完全。如果您正在修改诸如 Minecraft(例如)之类的东西,那么忘记 classForName 并坚持不更改界面。
    • 但是我该怎么做呢?使用 classForName 只是给了我一个 Class 对象,它并没有解决我原来在它的方法内部进行编辑的问题
    • 请阅读我的帖子、链接和 cmets。在我之前的评论中,我说“忘记 classForName”
    • 那么如果我不应该使用classForName,我应该使用什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多