实现事件系统(Java)

问题描述 投票:0回答:2

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

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 event) 或 onClose(ProgramCloseEvent event)。谢谢任何帮助。

java events system
2个回答
0
投票

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

public void execute(Listener listener) {

要调用,只需输入

method.invoke(listener, event);

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

null
而不是监听器)


0
投票

我知道我已经晚了 6 年。但如果有人仍然有他的项目需要 EventSystem 的问题,我可以推荐这个易于使用的库 https://github.com/cyklon73/JEvent

© www.soinside.com 2019 - 2024. All rights reserved.