脱离上下文编译Java文件

脱离上下文编译Java文件,java,jar,package,decompiling,Java,Jar,Package,Decompiling,我有一个很大的预编译项目,有很多包和类文件。我提取了一个类文件,并对其进行了反编译,编辑了其中的一些代码。现在我想编译更改后的代码,并将其重新插入到原始的预编译项目中,但不幸的是,该代码保留了对预编译项目中对象的许多引用,因此我无法在项目中没有它的情况下进行编译,这造成了一个相当大的悖论。我有什么可以做的吗 只需使用引用现有类文件(或包含这些类文件的jar文件)的类路径编译它即可。应该没有问题 但是,请注意,如果更改文件中的任何常量,这些更改将不会反映在引用这些常量的任何其他代码中 从完整的源代

我有一个很大的预编译项目,有很多包和类文件。我提取了一个类文件,并对其进行了反编译,编辑了其中的一些代码。现在我想编译更改后的代码,并将其重新插入到原始的预编译项目中,但不幸的是,该代码保留了对预编译项目中对象的许多引用,因此我无法在项目中没有它的情况下进行编译,这造成了一个相当大的悖论。我有什么可以做的吗

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

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


从完整的源代码重新编译通常是一个更好的主意。使用原始源代码也比仅仅使用反编译的结果更好——您没有访问原始源代码的权限吗?(如果你不知道,你确定你所做的事情在你的国家是合法的吗?我不是律师,但你至少应该检查一下…

我会重新编译整件事以避免出现问题,但如果你必须这样做,尝试一下,让我知道它们是否对你有用:

使用classForName加载类,而不是在原始项目中加载该类

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


还要记住serialVersionId

否,我没有访问原始源代码的权限。不要害怕,这只是为了教育目的:)@JohnDoe:“教育目的”并不意味着某些东西是合法的,甚至不一定是道德的。在继续之前要仔细考虑——还要问问自己,最初的作者是否希望你做你计划做的事情。如果他们愿意,也许他们已经提供了源代码。如果他们不愿意,你真的愿意违背他们的意愿吗?你是说我可以用classForName方法从jar加载类,然后在其中一个方法中更改一些内容,只要我不更改任何签名?关闭,但不是完全关闭。如果你正在修改像Minecraft这样的东西(例如),那么忘记classForName,坚持不改变界面。但是我该怎么做呢?使用classForName只是给了我一个类对象,它并不能解决我最初编辑它的方法内部的问题。请阅读我的文章、链接和评论。在我之前的评论中,我说“忘记classForName”,所以如果我不应该使用classForName,我应该使用什么?