mirror of
https://github.com/architectury/architectury-api.git
synced 2026-03-28 03:56:59 -05:00
Switch to MethodHandlers to avoid wrapping exceptions with InvocationTargetException due to reflection
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -1 +1,5 @@
|
||||
{}
|
||||
{
|
||||
"textures": [
|
||||
"architectury_test:test_particle"
|
||||
]
|
||||
}
|
||||
|
Before Width: | Height: | Size: 898 B After Width: | Height: | Size: 898 B |
Reference in New Issue
Block a user