在Java中,我可以监听一个类中发生的操作,然后执行并行操作吗



我需要监视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侦听器来实现这一点。您可以在事件发生之前、期间或之后定义建议。

最新更新