【问题标题】:Implementing an event system (Java)实现事件系统 (Java)
【发布时间】:2018-09-18 00:53:11
【问题描述】:

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

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)。感谢任何帮助。

【问题讨论】:

  • 您是在问如何调用您找到的method?比如method.invoke(...)?
  • 不,我正在尝试调用我将定义但可以包含不同参数的方法。如上例:public void onUpdate(ProgramUpdateEvent event) 或 be onClose(ProgramCloseEvent event)。然而,这两个类都将实现 Listener 接口。
  • 我想了解您想要什么。在您的execute 方法中,您检查类是否实现Listener 并搜索标有@EventHandler 的方法。你有method 就在那里,在循环中。你想调用它还是不调用它?在哪个实例上?参加什么活动?
  • 这就是我感到困惑的地方,我从来没有使用过这样的东西。我需要调用它吗?如果有怎么办?我当前的方法检查它是否是侦听器类以及方法是否具有 EventHandler 注释。接下来我想(调用?)调用该方法,就像我调用它一样,例如 runCode();
  • 我仍然不知道你到底想做什么。通常,您有订阅事件并在事件发布时被调用的侦听器。但我不确定你想用注解和Listener 接口做什么。为什么是execute(Class),如果您想发布事件,那么您从哪里获得这些事件?听众是如何注册的?

标签: java events system


【解决方案1】:

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

public void execute(Listener listener) {

要调用,只需放

method.invoke(listener, event);

第一个参数是实际调用方法的对象,第二个是方法的参数。因为这些方法不是静态的,所以您需要对该对象的引用。 (如果您将它们设为静态,只需将 null 放在侦听器中即可)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2011-06-14
    • 1970-01-01
    • 2012-11-08
    • 2011-01-12
    • 2015-04-16
    • 2012-04-06
    相关资源
    最近更新 更多