java - 如何制作一个注释事件系统?

标签 java events annotations system

我正在尝试创建一个基于注释的事件系统,就像您注册一个实现接口(interface)的类一样,然后您可以使用在被调用的方法之上具有 @interface 的事件。就像这样:

Wherever.java

EventManager.callEvent(new HelloEvent);

EventManager.register(new ClassThatImplementsListeenr);

@EventHandler
public void onHello(HelloEvent event) {
    event.sayHello();
}

好的,我了解很多内容,例如注册(将它们添加到数组列表)和创建监听器接口(interface)以及事件接口(interface)。新事件将实现事件,以及一个名为 EventHandler 的 @Interface,它只能与方法一起使用。主要部分是我不明白的。如何调用和检查注释。

编辑我刚刚做了这个,它有用吗?

Public class EventManager {

    private static List<Listener> registered = new ArrayList<Listener>();

    public static void register(Listener listener) {
        if (!registered.contains(listener)) {
            registered.add(listener);
        }
    }

    public static void unregister(Listener listener) {
        if (registered.contains(listener)) {
            registered.remove(listener);
        }
    }

    public static List<Listener> getRegistered() {
        return registered;
    }

    public static void callEvent(final Event event) {
        new Thread() {
            public void run() {
                call(event);
            }
        }.start();
    }

    private static void call(final Event event) {
        for (Listener listener : registered) {
            Method[] methods = listener.getClass().getMethods();
            for (Method method : methods) {
                if (method.isAnnotationPresent(EventHandler.class)) {
                    try {
                        method.invoke(listener.getClass().newInstance(), event);
                    } catch (Exception exception) {
                        exception.printStackTrace();
                    }
                }
            }
        }
    }
}

最佳答案

您可以通过以下方式检查已添加到方法中的注释

  1. 检索类上可用的所有方法:

    public void registerListeners(T handler){
    
    Method[] allMethods = handler.getClass().getMethods();
    
    
    
    }
    
  2. 检查具有所需注释的所有方法(尽管我认为任何给定类中只有一个方法应该指定有事件监听器类型注释)

    List<Method> listenerMethods = new ArrayList<Method>();
    for (Method aMethod: allMethods){
    
      if(aMethod.isAnnotationPresent(EventHandler.class)){
         listenerMethods.add(aMethod);
      }
    
    }
    
  3. 鉴于具有注释的特定方法,您可以调用 Method#invoke在执行监听器的方法的候选列表中。

关于java - 如何制作一个注释事件系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24524716/

相关文章:

java - JButton 和 GUI 在单击后卡住

java - 使用自定义注释实现依赖注入(inject)

python - 从 __future__ 导入注释

java - 如何在定时循环中检测按钮按下情况

java - 带字符、数字和标点符号的密码正则表达式

java - 通用方法 - "unchecked conversion to conform to T from the type"警告

c# - EventArgs 类和 event 关键字之间是否存在特殊关联?

javascript - React - 从目标中获取值(value)

javascript - 如何检查是否通过 java 脚本打开浏览器搜索(使用 Ctrl+F)选项?

ios - 新的 PList 检索代码可防止调用 MKMapView 委托(delegate)方法 (iOS)