From 555c40e387cd3b5496e3b8581a68db4d1e10515d Mon Sep 17 00:00:00 2001 From: Wesley Wolfe Date: Sun, 26 Aug 2012 21:14:28 -0500 Subject: Allow inherited methods to be event handlers. Addresses BUKKIT-2299 This change lets JavaPluginLoader use a temporary HashSet to store methods that could possibly have the EventHandler annotation. Duplicates are prevented by the nature of a Set. Registering parent listeners is a breaking change for any listener extending another listener and expecting parent listeners to not be called. Changing this is justified by the ease-of-use and proper object inheritance design. If this is undesired behavior, the method may be overridden without reapplying the method with the EventHandler notation. --- src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java index c82f731c..1c04edfe 100644 --- a/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java +++ b/src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java @@ -276,16 +276,22 @@ public class JavaPluginLoader implements PluginLoader { boolean useTimings = server.getPluginManager().useTimings(); Map, Set> ret = new HashMap, Set>(); - Method[] methods; + Set methods; try { - methods = listener.getClass().getDeclaredMethods(); + Method[] publicMethods = listener.getClass().getMethods(); + methods = new HashSet(publicMethods.length, Float.MAX_VALUE); + for (Method method : publicMethods) { + methods.add(method); + } + for (Method method : listener.getClass().getDeclaredMethods()) { + methods.add(method); + } } catch (NoClassDefFoundError e) { plugin.getLogger().severe("Plugin " + plugin.getDescription().getFullName() + " has failed to register events for " + listener.getClass() + " because " + e.getMessage() + " does not exist."); return ret; } - for (int i = 0; i < methods.length; i++) { - final Method method = methods[i]; + for (final Method method : methods) { final EventHandler eh = method.getAnnotation(EventHandler.class); if (eh == null) continue; final Class checkClass = method.getParameterTypes()[0]; -- cgit v1.2.3