我正在尝试创建一个基于注释的事件系统,就像您注册一个实现接口(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();
}
}
}
}
}
}
最佳答案
您可以通过以下方式检查已添加到方法中的注释
检索类上可用的所有方法:
public void registerListeners(T handler){ Method[] allMethods = handler.getClass().getMethods(); }
检查具有所需注释的所有方法(尽管我认为任何给定类中只有一个方法应该指定有事件监听器类型注释)
List<Method> listenerMethods = new ArrayList<Method>(); for (Method aMethod: allMethods){ if(aMethod.isAnnotationPresent(EventHandler.class)){ listenerMethods.add(aMethod); } }
鉴于具有注释的特定方法,您可以调用
Method#invoke
在执行监听器的方法的候选列表中。
关于java - 如何制作一个注释事件系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24524716/