2017-09-01 66 views
0

在调用自定义方法时,Java中是否有使用反射或其他方法调用方法或类的方法?调用方法A时调用另一个方法B

我有一个装library.jar,其中让Foo.class有方法找时间做(String的形式,为MyObject B)

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

我需要一个触发我的自定义方法酒吧#doThis ,当Foo#doThat被调用。

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

我将无法提取jar和注入监听器。 让Foo.class的java.util.ArrayListfinal类java.util.zip.ZipCoder

+0

https://stackoverflow.com/questions/9664036/how-to-run-two-methods-simultaneously或者大概是https://stackoverflow.com/questions/18162863/how-to-run-different-methods-平行? – nullpointer

+0

Foo实例在哪里被使用?你是否将Foo实例提供给正在调用该方法的另一个对象,并且你需要间接的吗?你可能可以用foo子类来包装foo实例,该子类将所有调用委托给foo实例,除了可以触发回调的doThat,然后调用mFoo.doThat(); – Selecsosi

回答

0

为了扩大对我最初的问题,使自定义子类,它代表所有的FOO的调用相似原始foo对象除了您替换的对象外,请打电话给​​,然后调用实际的foo.doThat。你可以这样做两种方式,一是通过继承原Foo类,如果您正在创建Foo s ^自己,或者你可以做一个包装类,直接委托给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有你可以实现这一点,代表一个接口,而不是扩展子类

0

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

当你可以在前/后拦截任何方法,甚至可以覆盖它。

希望这会有所帮助。