0

我有一个 java 类文件,第三部分,我没有它的源代码,但它总是在它的一个方法中抛出一些异常,我想编辑那个方法,为它添加一个 try catch 块。

我试图反编译它,但是源代码不好用,它看起来很模糊而不是完整的。

我怎样才能做到这一点?

4

4 回答 4

1

如果包装不起作用,因为您无法安排实例化包装类而不是原始类,那么您将遇到一个难题:

  • 正如您所观察到的,反编译混淆的类可能会导致无法编译的源代码。这是一个内部类的事实可能会使这变得更加棘手。

  • 字节码工程可能有效;例如,找到new正在实例化错误类的对象,并将其更改为实例化包装类。但是你将不得不编写你的包装类来反射地实例化内部类......并且由于混淆,访问限制和在实例化非静态嵌套类时需要传递的隐藏参数,它会很混乱。

上述两种情况都涉及显着的疼痛。即使您成功了,如果您需要将 3rd-party 库升级到新版本,它们也会给您留下未来的问题。

我想我会以另一种方式解决这个问题。例如:

  • 确定异常的原因,并尝试实施一种解决方法来避免触发异常的条件。

  • 联系您尝试使用的产品的支持团队,让他们为您提供修复或解决方法。

  • 更改为提供源代码以及修补问题和从源代码重建的资金的不同产品。

于 2012-10-04T03:06:06.993 回答
1

我能提供的最佳解决方案是使用AspectJ并使用 CTW(编译时编织)方面。您可以在一个方面用 try/catch 包装该方法。在这样做时,您不需要更改任何代码,并且您的方面只会在编译时注入。

当然,使用 AOP 会增加应用程序的复杂性,因此您必须熟悉使用方面。否则,我强烈推荐@duffymo 的解决方案,并用您自己的包含try/catch 的类包装第3 方库。

于 2012-10-04T04:16:42.080 回答
1

它可能混淆了,但我不相信它不完整。

我不会推荐这种方法。为什么不能在代码中捕获异常?做它并继续前进。

编辑别人代码的另一种首选方法是编写自己的包装器来扩展该类。在冒犯您的方法中捕获异常。

两者都比反编译和修改别人的代码更可取。这是长期悲伤的秘诀。

像这样:

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.
       }
    }
}
于 2012-10-04T02:40:35.787 回答
0

你用的是哪个反编译器?我已经成功使用了JD GUI

于 2012-10-04T02:40:22.457 回答