我试图创建一个基于注释的事件系统,就像你注册一个实现接口的类一样,然后你就可以使用在被调用的方法之上有@interface的事件。像这样:
Wherever.java
EventManager.callEvent(new HelloEvent);
EventManager.register(new ClassThatImplementsListeenr);
@EventHandler
public void onHello(HelloEvent event) {
event.sayHello();
}
好的,我理解很多这样的注册(将它们添加到arraylist)并制作一个监听器接口和Event接口。 New Events将实现Event,以及一个名为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();
}
}
}
}
}
}
答案 0 :(得分:0)
您可以通过
检查已添加到方法的注释检索课程中可用的所有方法:
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
来执行侦听器。