summaryrefslogtreecommitdiffstats
path: root/src/main
diff options
context:
space:
mode:
authorWesley Wolfe <weswolf@aol.com>2012-08-26 21:14:28 -0500
committerWesley Wolfe <weswolf@aol.com>2012-08-26 21:14:28 -0500
commit555c40e387cd3b5496e3b8581a68db4d1e10515d (patch)
treebea1004ff58ec2ed85c3d81cc2f037204d4bfee5 /src/main
parente04c1c2a1848a156f279ab913347a51fba3781d1 (diff)
downloadbukkit-555c40e387cd3b5496e3b8581a68db4d1e10515d.tar
bukkit-555c40e387cd3b5496e3b8581a68db4d1e10515d.tar.gz
bukkit-555c40e387cd3b5496e3b8581a68db4d1e10515d.tar.lz
bukkit-555c40e387cd3b5496e3b8581a68db4d1e10515d.tar.xz
bukkit-555c40e387cd3b5496e3b8581a68db4d1e10515d.zip
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.
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/bukkit/plugin/java/JavaPluginLoader.java14
1 files 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<Class<? extends Event>, Set<RegisteredListener>> ret = new HashMap<Class<? extends Event>, Set<RegisteredListener>>();
- Method[] methods;
+ Set<Method> methods;
try {
- methods = listener.getClass().getDeclaredMethods();
+ Method[] publicMethods = listener.getClass().getMethods();
+ methods = new HashSet<Method>(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];