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

时间:2017-09-01 18:51:42

标签: java reflection

在Java中使用反射或任何方法,在调用自定义方法时调用方法或类。

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

event.month

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

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

我将无法提取jar并注入侦听器。 Foo.class java.util.ArrayList final class java.util.zip.ZipCoder

类似

2 个答案:

答案 0 :(得分:0)

要扩展我的初始问题,请创建一个自定义子类,将所有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有一个接口,你可以实现它并委托而不是扩展子类

答案 1 :(得分:0)

看起来你想要做的就是拦截一个方法执行。这可以使用Aspect Oriented Programming完成。您有2个替代方案,例如aspectjSprint AOP

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

希望这有帮助。