事件管理器未调用(Java)
因此,这是我第一次编写一个合适的事件管理器,但是由于某种原因,我的方法调用并调用存储的键/值,抛出了一个NullPointerException,即使我在我的register方法中将类和方法数据添加到映射中 我的呼叫方式:事件管理器未调用(Java),java,events,methods,reflection,Java,Events,Methods,Reflection,因此,这是我第一次编写一个合适的事件管理器,但是由于某种原因,我的方法调用并调用存储的键/值,抛出了一个NullPointerException,即使我在我的register方法中将类和方法数据添加到映射中 我的呼叫方式: public static final void fire(final Event event) { final Class<? extends Event> clazz = event.getClass(); final List
public static final void fire(final Event event) {
final Class<? extends Event> clazz = event.getClass();
final List<EventListener> listeners = eventMap.get(clazz);
if(listeners != null) {
for(EventListener listener : listeners) {
try {
listener.getMethod().invoke(listener.getObject(), event);
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
如果我理解正确的话,您只允许作为参数接受
o.getClass()
并注册它们的方法,就像它们自己处理它们一样。(例如,您注册了类动物,它只处理事件动物)
if(!eventMap.containsKey(clazz)和&m.getParameterTypes()[0].equals(clazz)){
put(clazz,newlinkedlist());
}
(查看第二个条件(注册方法))没有堆栈跟踪,没有帮助。EventManager的第49行在哪里?for(EventListener:listeners){我想问题一定出在代码的其他地方。你调试过寄存器吗?在调用fire之前确实填充了映射吗?你调试过映射没有被新的替换吗?或者你在调用fire之前注销了一个对象吗?我试图使它只注册具有事件作为其超类的类,但我已经完成了删除了它,但它仍然认为my fire方法中的映射为空。可能是因为您在创建方法时,事件处理程序必须位于实际事件中…
eventMap.put(**clazz**,new LinkedList());
如果需要,请查看我的快速事件总线()
public static final void register(Object o) {
Class clazz = o.getClass();
Method[] methods = clazz.getDeclaredMethods();
for(Method m : methods) {
final Handler handler = m.getAnnotation(Handler.class);
if(handler == null) continue;
if(!m.isAccessible())
m.setAccessible(true);
if(!eventMap.containsKey(clazz) && m.getParameterTypes()[0].equals(clazz)) {
eventMap.put(clazz, new LinkedList<EventListener>());
}
}
}
public static final void unregister(Object o) {
Class clazz = o.getClass();
Method[] methods = clazz.getDeclaredMethods();
for(Method m : methods) {
if(eventMap.containsKey(clazz)) {
final List<EventListener> listener = eventMap.get(clazz);
eventMap.remove(clazz, listener);
}
}
if(!eventMap.containsKey(clazz) && m.getParameterTypes()[0].equals(clazz)) {
eventMap.put(clazz, new LinkedList<EventListener>());
}