我有一个 java 类文件,第三部分,我没有它的源代码,但它总是在它的一个方法中抛出一些异常,我想编辑那个方法,为它添加一个 try catch 块。
我试图反编译它,但是源代码不好用,它看起来很模糊而不是完整的。
我怎样才能做到这一点?
我有一个 java 类文件,第三部分,我没有它的源代码,但它总是在它的一个方法中抛出一些异常,我想编辑那个方法,为它添加一个 try catch 块。
我试图反编译它,但是源代码不好用,它看起来很模糊而不是完整的。
我怎样才能做到这一点?
如果包装不起作用,因为您无法安排实例化包装类而不是原始类,那么您将遇到一个难题:
正如您所观察到的,反编译混淆的类可能会导致无法编译的源代码。这是一个内部类的事实可能会使这变得更加棘手。
字节码工程可能有效;例如,找到new
正在实例化错误类的对象,并将其更改为实例化包装类。但是你将不得不编写你的包装类来反射地实例化内部类......并且由于混淆,访问限制和在实例化非静态嵌套类时需要传递的隐藏参数,它会很混乱。
上述两种情况都涉及显着的疼痛。即使您成功了,如果您需要将 3rd-party 库升级到新版本,它们也会给您留下未来的问题。
我想我会以另一种方式解决这个问题。例如:
确定异常的原因,并尝试实施一种解决方法来避免触发异常的条件。
联系您尝试使用的产品的支持团队,让他们为您提供修复或解决方法。
更改为提供源代码以及修补问题和从源代码重建的资金的不同产品。
我能提供的最佳解决方案是使用AspectJ并使用 CTW(编译时编织)方面。您可以在一个方面用 try/catch 包装该方法。在这样做时,您不需要更改任何代码,并且您的方面只会在编译时注入。
当然,使用 AOP 会增加应用程序的复杂性,因此您必须熟悉使用方面。否则,我强烈推荐@duffymo 的解决方案,并用您自己的包含try/catch 的类包装第3 方库。
它可能被混淆了,但我不相信它不完整。
我不会推荐这种方法。为什么不能在代码中捕获异常?做它并继续前进。
编辑别人代码的另一种首选方法是编写自己的包装器来扩展该类。在冒犯您的方法中捕获异常。
两者都比反编译和修改别人的代码更可取。这是长期悲伤的秘诀。
像这样:
public class BadLibrary {
public void toast() { throw new IllegalArgumentException(); }
}
public class MyWrapper extends BadLibrary {
public void toast() {
try {
super.toast();
} catch (Exception e) {
// log, print, or ignore.
}
}
}
你用的是哪个反编译器?我已经成功使用了JD GUI