2014-04-19 55 views
0

我正在處理一個事件處理系統,並且我正在努力使其中的每個方面都自動化,爲此,我試圖創建一個方法來觸發事件處理程序時尚,但是我打了一堵牆。Java:調用具有特定類型參數的方法

我試圖做一個方法調用方法的參數,我不在乎他們的名字或內容,只是他們的參數類型。事情是,我不知道如何創建一個方法,通過它們的參數類型調用某些方法。

一個簡單的例子,讓你們更好地理解我試圖完成什麼。

public void invokeEvent(Event eventToBeInvoked) { 

    for(Method m : listenerClass.getMethods()) { 
     for(Parameter p : m.getParameters()) { 
      if(p.getClass().equals(eventToBeInvoked.getClass())) { 
       m.invoke(eventToBeInvoked); 
      } 
     } 
    } 
} 

listenerClass是包含所有處理事件時,他們被解僱的方法的類,因此可以說這是在上面的例子中觸發事件是DiceRollEvent它擴展了事件類,其接收的方法DiceRollEvent將由上面的例子中被調用,例如:

public void diceRollHandler(DiceRollEvent e) { 
     int turnNo = e.getTurnNumber(); 
     System.out.println("This is the 34th turn of the game."); 
} 

,這將導致最終輸出是:「這是遊戲的第34匝。」。

這就是我碰壁的地方,我如何讓一個類只調用包含某些參數類型的方法?

謝謝您的協助!

+0

我想你正在尋找多態方法? – Bono

+0

是的,因爲它關於事件,它必須是多態才能通過事件,並且它只有1個方法來調用所有類型的事件,所有事件都必須擴展Event類 – Daedalus

回答

0

我不完全知道你在找什麼,但也可能是這個(多態法):

在事件處理器類有一個方法:

public void eventHandler(Event event){ 
    event.handleEvent(); 
} 

這樣,任何作爲父母的Event可以作爲參數發送。然後在Event類做的方法:

public void handleEvent(){ 
    //Do something 
} 

或者你可以重寫,以適應從Event@override)擴展每個特定類的需求,上述方法。 希望這就是你要找的!

編輯

或者你可能在尋找這樣的事情:

public void eventHandler(DiceRollEvent event){ 
    //Do something 
} 

public void eventHandler(SomeOtherEvent event){ 
    //Do something 
} 
+0

但是如果我希望所有事件處理程序都在一個類中,以便它們可以共享變量,或者如果我希望其他人將他們自己的處理程序添加到該特定事件,那爲什麼我不希望事件的處理在實際事件類中,我只想要事件的信息在裏面 – Daedalus

+0

@ user3551702更新了問題,那是你在找什麼? (改變方法的簽名,也就是同樣的方法,但不同的參數)。 – Bono

+0

這太棒了,非常感謝! – Daedalus

0

給予外部系統或用戶任意對象上調用任意方法的權利,可能是危險的,我建議建設一個API,它會尊重您可以調用某些方法的對象。

不過,您可以嘗試使用Reflection API。它會在你的代碼中進行解釋。

首先通過獲取方法:

java.lang.Class 
    public Method getDeclaredMethod(String name, Class<?>... parameterTypes) 

,然後調用方法感興趣的實例。

java.lang.reflect.Method 
    public Object invoke(Object obj, Object... args) 
+0

我如何知道我所得到的方法是否具有我需要的特定類型的參數? – Daedalus

相關問題