我需要监视Java类中某个特定方法中发生的错误,该错误由于为第三方所有而无法更改。该方法由系统中的一个特定功能调用,该功能最终会导致跳过几个环来修复它(因为一个通用错误被写入UI和日志中——我们将寻求类的所有者(外部供应商)来修复它,但这可能需要一段时间)。
作为一种解决方法,我对该类进行了反编译,并添加了logger语句,用于打印导致该问题的数据元素。这可以运行只有在获得许可的情况下才能从外部进行,并且不能将其放入生产环境中(因为合同和其他问题)。
是否可以在不实际编辑原始类的情况下"监听"调用此方法?或者还有其他我没有想到的合适的变通方法吗?
编辑
我同意Paul Boddington的观点,认为这可能是一个XY问题。您可以使用以下解决方案之一,但可能您遇到的问题与您描述的不同。你可能需要重新考虑你真正想要实现的目标。
你有几个选择:
-
您可以将类"A"划分为子类,然后当事件发生时,通知注册的侦听器,如下所示:
public class SubA extends A { private AListener listener; public void method1() { if (this.listener != null) { this.listener.notifyMethodCall(); } super.method1(); } public void setAListener(AListener listener) { this.listener = listener; } }
和
AListener
接口:public interface AListener { void notifyMethodCall(); }
B
:类public class B implements AListener { public B(A a) { a.setAListener(this); } public void notifyMethodCall() { // Do whatever you want. } }
-
如果方法调用
A.method1()
更改其自身的属性,则可以基于其值间隔来检查其值,例如,每秒检查一次其值,但在这种情况下,这通常是不好的。
类A
可能无法重写,因为它是final
类,但这通常被认为是一个糟糕的设计。然而,String
类是一个例外
是的,我相信您也可以使用AOP侦听器来实现这一点。您可以在事件发生之前、期间或之后定义建议。