在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
类似答案 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个替代方案,例如aspectj和Sprint AOP。
当您可以在之前/之后拦截任何方法或甚至覆盖它时。
希望这有帮助。