mirror of
https://github.com/PaperMC/Waterfall.git
synced 2024-09-27 22:17:57 +02:00
Dispatch events using MethodHandles
This commit is contained in:
parent
f6788a0886
commit
a8834f1b27
@ -0,0 +1,78 @@
|
||||
From 78be93295c6c4f079e8746c4b896a30003be46fc Mon Sep 17 00:00:00 2001
|
||||
From: Jamie Mansfield <dev@jamierocks.uk>
|
||||
Date: Sun, 22 Jul 2018 18:10:53 +0100
|
||||
Subject: [PATCH] Use MethodHandles for event dispatching
|
||||
|
||||
MethodHandles are faster than reflection, and improve exceptions (the exceptions are not through proxies).
|
||||
|
||||
diff --git a/event/src/main/java/net/md_5/bungee/event/EventBus.java b/event/src/main/java/net/md_5/bungee/event/EventBus.java
|
||||
index 5b5d4201..d1acf748 100644
|
||||
--- a/event/src/main/java/net/md_5/bungee/event/EventBus.java
|
||||
+++ b/event/src/main/java/net/md_5/bungee/event/EventBus.java
|
||||
@@ -1,5 +1,7 @@
|
||||
package net.md_5.bungee.event;
|
||||
|
||||
+import java.lang.invoke.MethodHandles;
|
||||
+import java.lang.invoke.WrongMethodTypeException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import java.text.MessageFormat;
|
||||
@@ -44,13 +46,10 @@ public class EventBus
|
||||
try
|
||||
{
|
||||
method.invoke( event );
|
||||
- } catch ( IllegalAccessException ex )
|
||||
- {
|
||||
- throw new Error( "Method became inaccessible: " + event, ex );
|
||||
- } catch ( IllegalArgumentException ex )
|
||||
+ } catch ( WrongMethodTypeException | ClassCastException ex )
|
||||
{
|
||||
throw new Error( "Method rejected target/argument: " + event, ex );
|
||||
- } catch ( InvocationTargetException ex )
|
||||
+ } catch ( Throwable ex )
|
||||
{
|
||||
logger.log( Level.WARNING, MessageFormat.format( "Error dispatching event {0} to listener {1}", event, method.getListener() ), ex.getCause() );
|
||||
}
|
||||
@@ -186,8 +185,13 @@ public class EventBus
|
||||
{
|
||||
for ( Method method : listenerHandlers.getValue() )
|
||||
{
|
||||
- EventHandlerMethod ehm = new EventHandlerMethod( listenerHandlers.getKey(), method );
|
||||
- handlersList.add( ehm );
|
||||
+ try {
|
||||
+ EventHandlerMethod ehm = new EventHandlerMethod( listenerHandlers.getKey(), MethodHandles.lookup().unreflect(method) );
|
||||
+ handlersList.add( ehm );
|
||||
+ }
|
||||
+ catch (final IllegalAccessException ex) {
|
||||
+ logger.log( Level.WARNING, "Method became inaccessible, unable to register!", ex );
|
||||
+ }
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/event/src/main/java/net/md_5/bungee/event/EventHandlerMethod.java b/event/src/main/java/net/md_5/bungee/event/EventHandlerMethod.java
|
||||
index ad19c020..eadcc183 100644
|
||||
--- a/event/src/main/java/net/md_5/bungee/event/EventHandlerMethod.java
|
||||
+++ b/event/src/main/java/net/md_5/bungee/event/EventHandlerMethod.java
|
||||
@@ -1,5 +1,7 @@
|
||||
package net.md_5.bungee.event;
|
||||
|
||||
+import java.lang.invoke.MethodHandle;
|
||||
+import java.lang.invoke.WrongMethodTypeException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
import lombok.AllArgsConstructor;
|
||||
@@ -12,9 +14,9 @@ public class EventHandlerMethod
|
||||
@Getter
|
||||
private final Object listener;
|
||||
@Getter
|
||||
- private final Method method;
|
||||
+ private final MethodHandle method;
|
||||
|
||||
- public void invoke(Object event) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException
|
||||
+ public void invoke(Object event) throws Throwable
|
||||
{
|
||||
method.invoke( listener, event );
|
||||
}
|
||||
--
|
||||
2.18.0
|
||||
|
Loading…
Reference in New Issue
Block a user