Commits

Jonas Konrad authored and md_5 committed b333b58c05a
SPIGOT-893: Fix bridge method registering generic listeners twice
No tags

src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java

Modified
243 243 methods.add(method);
244 244 }
245 245 } catch (NoClassDefFoundError e) {
246 246 plugin.getLogger().severe("Plugin " + plugin.getDescription().getFullName() + " has failed to register events for " + listener.getClass() + " because " + e.getMessage() + " does not exist.");
247 247 return ret;
248 248 }
249 249
250 250 for (final Method method : methods) {
251 251 final EventHandler eh = method.getAnnotation(EventHandler.class);
252 252 if (eh == null) continue;
253 + // Do not register bridge or synthetic methods to avoid event duplication
254 + // Fixes SPIGOT-893
255 + if (method.isBridge() || method.isSynthetic()) {
256 + continue;
257 + }
253 258 final Class<?> checkClass;
254 259 if (method.getParameterTypes().length != 1 || !Event.class.isAssignableFrom(checkClass = method.getParameterTypes()[0])) {
255 260 plugin.getLogger().severe(plugin.getDescription().getFullName() + " attempted to register an invalid EventHandler method signature \"" + method.toGenericString() + "\" in " + listener.getClass());
256 261 continue;
257 262 }
258 263 final Class<? extends Event> eventClass = checkClass.asSubclass(Event.class);
259 264 method.setAccessible(true);
260 265 Set<RegisteredListener> eventSet = ret.get(eventClass);
261 266 if (eventSet == null) {
262 267 eventSet = new HashSet<RegisteredListener>();

Everything looks good. We'll let you know here if there's anything you should know about.

Add shortcut