Switch to MethodHandlers to avoid wrapping exceptions with InvocationTargetException due to reflection

This commit is contained in:
shedaniel
2021-08-06 17:09:05 +08:00
parent 790edf8264
commit 4ef7f45ae7
3 changed files with 16 additions and 6 deletions

View File

@@ -26,6 +26,7 @@ import dev.architectury.injectables.annotations.ExpectPlatform;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
@@ -48,13 +49,18 @@ public final class EventFactory {
return createLoop((Class<T>) typeGetter.getClass().getComponentType());
}
private static <T, R> R invokeMethod(T listener, Method method, Object[] args) throws Throwable {
return (R) MethodHandles.lookup().unreflect(method)
.bindTo(listener).invokeWithArguments(args);
}
@SuppressWarnings("UnstableApiUsage")
public static <T> Event<T> createLoop(Class<T> clazz) {
return of(listeners -> (T) Proxy.newProxyInstance(EventFactory.class.getClassLoader(), new Class[]{clazz}, new AbstractInvocationHandler() {
@Override
protected Object handleInvocation(@NotNull Object proxy, @NotNull Method method, Object @NotNull [] args) throws Throwable {
for (var listener : listeners) {
method.invoke(listener, args);
invokeMethod(listener, method, args);
}
return null;
}
@@ -73,7 +79,7 @@ public final class EventFactory {
@Override
protected Object handleInvocation(@NotNull Object proxy, @NotNull Method method, Object @NotNull [] args) throws Throwable {
for (var listener : listeners) {
var result = (EventResult) Objects.requireNonNull(method.invoke(listener, args));
var result = (EventResult) Objects.requireNonNull(invokeMethod(listener, method, args));
if (result.interruptsFurtherEvaluation()) {
return result;
}
@@ -95,7 +101,7 @@ public final class EventFactory {
@Override
protected Object handleInvocation(@NotNull Object proxy, @NotNull Method method, Object @NotNull [] args) throws Throwable {
for (var listener : listeners) {
var result = (CompoundEventResult) Objects.requireNonNull(method.invoke(listener, args));
var result = (CompoundEventResult) Objects.requireNonNull(invokeMethod(listener, method, args));
if (result.interruptsFurtherEvaluation()) {
return result;
}
@@ -117,7 +123,7 @@ public final class EventFactory {
@Override
protected Object handleInvocation(@NotNull Object proxy, @NotNull Method method, Object @NotNull [] args) throws Throwable {
for (var listener : listeners) {
method.invoke(listener, args);
invokeMethod(listener, method, args);
}
return null;
}
@@ -144,7 +150,7 @@ public final class EventFactory {
@Override
protected Object handleInvocation(@NotNull Object proxy, @NotNull Method method, Object @NotNull [] args) throws Throwable {
for (var listener : listeners) {
var result = (EventResult) method.invoke(listener, args);
var result = (EventResult) invokeMethod(listener, method, args);
if (result.interruptsFurtherEvaluation()) {
return result;
}

View File

@@ -1 +1,5 @@
{}
{
"textures": [
"architectury_test:test_particle"
]
}