Java:使用特定类型的参数调用方法

时间:2014-04-19 13:17:08

标签: java events reflection event-handling method-parameters

我正在研究一个事件处理系统,我正在尝试使其中的每个方面都自动化,为此,我试图创建一个以自动方式触发事件处理程序的方法,但是我已经碰到了墙。

我试图制作一个通过参数调用方法的方法,我不关心它们的名称或内容,只关心它们的参数类型。问题是,我不知道如何创建一个通过参数类型调用某些方法的方法。

一个简单的例子,让你们更好地理解我想要完成的事情。

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个回合。"。

这就是我碰壁的地方,我如何让一个类只调用包含某些参数类型的方法?

感谢您的协助!

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

赋予外部系统或用户在任意对象上调用任意方法的权利可能是危险的,我建议构建一个尊重可以调用某些方法的对象的API。

尽管如此,您可以尝试使用Reflection API。它完成了你在你的代码中解释的内容。

首先通过以下方式获取方法:

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

然后在感兴趣的实例上调用Method。

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