繁体   English   中英

调用方法A时调用另一个方法B

[英]Call another method B when method A is called

在Java中,有没有一种方法可以使用反射或任何方法在调用自定义方法时调用方法或类。

我有一个打包的library.jar,其中Foo.class具有方法doThat(String a,MyObject b)

public class Foo {
    public Object doThat(String a, MyObject b) {
      // do something
      return null;
    }
}

当调用Foo#doThat时,我需要一个触发器我的自定义方法Bar#doThis

public class Bar {
    public boolean doThis(String a, MyObject b) {
      // did it.
      return true;
    }
}

我将无法提取jar并注入侦听器。 Foo.classjava.util.ArrayList最终类java.util.zip.ZipCoder相似

为了扩展我的第一个问题,请创建一个自定义子类,该子类将foo的所有调用委派给原始foo对象,但您重写的doThat除外,请调用bar.doThis ,然后再调用实际的foo.doThat 您可以通过以下两种方法进行操作,首先,如果您自己创建Foo ,则将原始Foo类子类化,或者可以创建一个包装类,直接将您不需要的Foo委托给它。

class SubFoo extends Foo {

    public SubFoo(fooParams..., Bar bar) {
        //...
        this.mFoo = new Foo(fooParams);
        this.mBar = bar;
    }

    @Override
    public Object doThat(String a, MyObject b) {
        this.mBar.doThis(a, b);
        this.mFoo.doThat(a, b);
    }
    //Other methods Foo has that just call into this.foo
}

只要不将Foo标记为final这应该就可以工作,或者您可以直接将其委托给foo

class DelegateToFoo extends Foo {

    public DelegateToFoo(Foo foo, Bar bar) {
        //...
        this.mFoo = foo;
        this.mBar = bar;
    }

    @Override
    public Object doThat(String a, MyObject b) {
        this.mBar.doThis(a, b);
        this.mFoo.doThat(a, b);
    }
    //Other methods Foo has that just call into this.foo
}

如果Foo有接口,则可以实现它并委托而不是扩展子类。

看起来您想要做的是拦截方法执行。 这可以使用面向方面的编程来完成。 您有2个替代方案,例如AspectjSprint AOP

当您可以在之前/之后截取任何方法甚至覆盖它时。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM