好的,这很难解释。我会尽力。
受 Bukkit 事件系统的启发,您可以通过使用 @EventHandler 使 voids 成为事件处理程序。
例子:
@EventHandler
public void aRandomName(PlayerMoveEvent ev) {
}
如您所见,方法的名称无关紧要。传递哪个事件由事件参数类型决定。
所有事件都扩展了 Event 类。我编写了一些我认为可以工作的代码,除了一件事。
public List<Object> eventContainers;
public void fireEvent(Event e) {
Method[] methods;
for (Object o : eventContainers) {
Object[] classes = o.getClass().getClasses();
for (Object clss : classes) {
methods = clss.getClass().getMethods();
for (Method m : methods) {
if (m.getAnnotation(EventHandler.class) != null) {
try {
Class[] requiredTypes = m.getParameterTypes();
for(Class cl : requiredTypes) {
if(e.equals(cl)) {
m.invoke(clss, e);
}
}
} catch (IllegalAccessException ex) {
} catch (IllegalArgumentException ex) {
} catch (InvocationTargetException ex) {
}
}
}
}
}
}
我的代码的作用:遍历 eventContainers 中的所有类,查找具有 @EventHandler 注释的方法并将指定的事件发送到该方法。但是,我想看看 fireEvent(Event e) 中给定的事件是什么类型的事件,然后看看需要这种事件参数的方法。我该怎么做?我认为
Class[] requiredTypes = m.getParameterTypes();
for(Class cl : requiredTypes) {
if(e.equals(cl)) {
m.invoke(clss, e);
}
}
不管用。
最终我希望能够将事件传递给插件。像这样:
EventManager.fireEvent(new PlayerMoveEvent(player));
它将被发送到所有插件和具有
@EventHandler
public void aVoid(PlayerMoveEvent e) {
//stuff
}
如果您有任何问题,我会尽力解释得更好。在此先感谢您的帮助!