我有一个JAR文件,有一个静态类,我不能反编译它,它搞砸了。其中有一个方法,它返回一个不存在的类。不知道怎么回事,但我得到了NoClassDefFoundError
。即使我不使用那个方法,它还是会崩溃。所以我需要把它拿掉,它就能正常工作了。我知道可以使用Reflection或Javassist,但不知道如何使用。
注意,这显然不是的生产版本,只是一些白帽黑客。
我认为你是错误的:如果该方法永远不会被调用,那么JVM将很可能不会尝试加载该类。
你看,类加载的全部意义——它发生在lazy;当你加载类X时,X需要Y, Z…那么只有在执行需要加载Y、Z的代码时才加载Y、Z。
换句话说:noclassdefffound错误实际上告诉您某些(可能是JAR中的某个静态初始化)正在调用该方法。
因此,解决方案不是"删除"那个方法(这只会导致另一个异常,如MethodNotFound!)。相反,您应该尝试创建一个虚拟类,这样根本就不会遇到该异常。或者:您的JAR至少缺少一个依赖项。你可以尝试解析这个依赖——也许你可以在某处找到这个类,或者,你可以"构建"你自己的版本(第二个想法可能是很难正确)。GhostCat已经解释了为什么你的问题不是删除一个方法。但我想我应该回答最初的问题,以防有人想知道。
从类文件中删除方法的最佳方法是使用Krakatau反汇编它,从.j
文件中删除您想要的方法,然后重新组装它。这个方法允许您编辑任何类文件,不管它有多奇怪。(如果你发现任何有效的类文件,而Krakatau反汇编器不能处理,请提交一个错误)。
在拆卸时,您可能还需要传递-roundtrip
选项。这不是正确性所必需的,但它可以防止常量池被重新排列,从而减少生成的类文件的二进制差异。另一方面,-roundtrip
也使得在.j
文件中找到您想要的方法变得更加困难。