2017-09-01 81 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

當你可以在前/後攔截任何方法,甚至可以覆蓋它。

希望這會有所幫助。