0

私はイベント処理システムに取り組んでおり、そのすべての側面を自動化しようとしています。そのために、イベントハンドラーを自動的に起動するメソッドを作成しようとしていますが、壁にぶつかりました。

パラメーターによってメソッドを呼び出すメソッドを作成しようとしていますが、名前や内容は気にせず、パラメーターの型だけを気にします。問題は、特定のメソッドをパラメーターの型で呼び出すメソッドを作成する方法がわかりません。

私が達成しようとしていることをよりよく理解してもらうための簡単な例です。

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 は、発生したイベントを処理するすべてのメソッドを含むクラスです。したがって、上記の例で発生したイベントは、Event クラスを拡張する DiceRollEvent であるとしましょう。DiceRollEvent を受け取るメソッドは、例によって呼び出されます。上記のように、次のようにします。

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

これにより、最終出力は「これはゲームの 34 ターン目です」となります。

これは私が壁にぶつかったところです。クラスが特定のパラメーター型のみを含むメソッドを呼び出すようにするにはどうすればよいですか?

ご協力いただきありがとうございます!

4

2 に答える 2

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
}
于 2014-04-19T13:25:27.753 に答える
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)
于 2014-04-19T13:26:35.913 に答える