实现事件系统(Java)

时间:2018-04-08 14:48:45

标签: java events system

好的,所以我基本上是在尝试为我正在进行的项目创建自己的事件/监听器系统。我正在尝试建立一个使用抽象类创建事件的系统,然后我可以创建一个监听器,每次调用该事件时,也会调用监听器中的代码。这是我到目前为止所得到的:

Event.java(我将能够创建新事件的抽象类)

private String name;
private boolean cancelled;

public String getEventName() {
    if (this.name == null) {
        this.name = this.getClass().getSimpleName();
    }
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

public boolean isCancelled() {
    return cancelled;
}

public void setCancelled(boolean cancelled) {
    this.cancelled = cancelled;
}

EventHandler.java(能够识别方法何时成为侦听器的接口)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface EventHandler {}

Listener.java(能够识别类何时包含侦听器的接口)

public interface Listener {}

EventExecutor.java(一个将执行侦听器代码的类,我已经开始了,但这是我需要帮助调用方法来执行代码的地方)

public void execute(Class clazz){
    if(!clazz.isAssignableFrom(Listener.class)) return;
    for(Method method : clazz.getMethods()){
        if(!method.isAnnotationPresent(EventHandler.class)) continue;
    }
}

所以我要问的是,当注释存在时,我如何(在EventExecutor中)调用(调用)方法。例如,该方法可以是public void onUpdate(ProgramUpdateEvent事件)或onClose(ProgramCloseEvent事件)。谢谢任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您需要实际拥有侦听器的实例。您的执行方法应如下所示:

public void execute(Listener listener) {

要调用,只需输入

即可
method.invoke(listener, event);

第一个参数是实际调用方法的对象,第二个参数是方法的参数。因为这些方法不是静态的,所以需要对该对象的引用。 (如果你把它们设为静态,只需要放置null而不是听众)