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 是一个类,其中包含在触发事件时处理事件的所有方法,因此假设在上面的示例中触发的事件是 DiceRollEvent,它扩展了 Event 类,接收 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 来尊重您可以调用某些方法的对象。

不过,您可以尝试使用反射 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 回答