代码之家  ›  专栏  ›  技术社区  ›  user8469677

实现事件系统(Java)

  •  0
  • user8469677  · 技术社区  · 6 年前

    好的,所以我基本上是在为我正在进行的项目创建自己的事件/侦听器系统。我试图创建一个系统,在该系统中,我使用抽象类创建一个事件,然后我可以创建一个监听器,每次调用该事件时,监听器中的代码也会被调用。以下是我目前掌握的情况:

    事件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 {}
    

    侦听器。java(用于识别类何时包含侦听器的接口)

    public interface Listener {}
    

    事件执行者。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 回复  |  直到 6 年前
        1
  •  0
  •   user5074736    6 年前

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

    public void execute(Listener listener) {
    

    要调用,只需将

    method.invoke(listener, event);
    

    第一个参数是实际调用方法的对象,第二个参数是方法的参数。因为这些方法不是静态的,所以需要对对象的引用。(如果使其静止,只需将 null 而不是监听器)