手动将方法调用添加到类文件中?

时间:2013-12-20 21:07:21

标签: java class bytecode

我需要手动将方法调用添加到类文件而不反编译和重新编译代码,因为它依赖于数以千计的其他类,我不需要做更多的事情而不是nessescary。我知道java,但不知道如何制作类文件。

感谢任何帮助。

编辑:

我不是源代码的所有者,我需要在任何计算机上工作,这意味着我无法重新分发源代码并在我的修补程序工作时实时编译它们。

8 个答案:

答案 0 :(得分:2)

您拥有源代码,并且您已编译了所有其他类。因此,您可以重新编译该源文件,使用-classpath选项将编译后的类作为参数传递给java编译器。

答案 1 :(得分:1)

您应该使用ASMJavaassist来操作字节码。 ASM有点复杂,需要您更多地了解JVM,但速度更快。 Javaassist并不要求您对JVM的内部结构有太多了解。

但是,我不明白为什么你不能只重新编译那个单一的源文件?如果您只需要添加一次此方法,那么学习ASM或Javaassist非常低效。

答案 2 :(得分:1)

子类化怎么样?然后你不需要触摸来源。

答案 3 :(得分:0)

因此,如果您有源代码并且只想将一些方法添加到一个类中。然后你不必担心其他类,即使它们依赖于你当前修改的类。重新编译文件不会影响其他类。由于输出将在运行时生成。

答案 4 :(得分:0)

如果您的类未声明为final且您感兴趣的方法不是final,则可以扩展该类并仅覆盖该方法。

答案 5 :(得分:0)

只需更改源代码,重新编译!一切都会好起来的。 Subclassing无效。因为在您更改代码以使用新的subclass而不是旧的subclass之前,现有的类不会知道新的superclass。< / p>

答案 6 :(得分:0)

对于手动编辑类文件,我建议Krakatau。 (披露,我写了)。它允许您反汇编类文件,编辑它并重新组装。还有其他汇编程序,但AFAIK,Krakatau是唯一支持类文件格式中所有奇怪边缘情况的汇编程序。

主要的警告是,Krakatau默认情况下不会保留某些可选的调试属性(特别是LineNumberTable,LocalVariableTable和LocalVariableTypeTable),因为没有简单的方法以人类可编辑的格式表示它们,并且无法在编辑它们时进行编辑。字节码更改将导致验证错误。很可能你实际上并不需要这个,所以它应该没关系。

另一个警告当然是你必须理解字节码。但是如果你不这样做,你无论如何都无法手动编辑类文件。

答案 7 :(得分:0)

我现在知道了!我创建了具有相同名称/方法的虚假源文件,但除了类和方法名称之外没有添加任何其他内容。这样我只需要打包直接链接到我的类文件的那些。但现在编译需要几毫秒,而过去需要大约124秒,哈哈。效果很好!