使用MethodHandle触发WrongMethodTypeException,是对象类型错误吗?
问题:MethodHandle替换反射实现Kyori事件总线执行器时抛出WrongMethodTypeException
我在将事件系统从反射切换为MethodHandle时遇到异常,使用的是KyoriPowered 3.0.0版本的事件总线。
我的实现代码如下:
public class EventExecutorFactory implements EventExecutor.Factory<Event, Listener> { @Override public @NonNull EventExecutor<Event, Listener> create(@NonNull Object object, @NonNull Method method) throws Exception { // object is Listener method.setAccessible(true); Class<? extends Event> actualEventType = method.getParameterTypes()[0].asSubclass(Event.class); MethodHandle handle = MethodHandles.lookup().unreflect(method); return new EventExecutor<Event,Listener>() { @Override public void invoke(@NonNull Listener listener, @NonNull Event event) throws Throwable { if (!actualEventType.isInstance(event)) return; // many different event types defined in my system, so I should check it first. handle.invoke(actualEventType.cast(event)); // WrongMethodTypeException thrown here } }; } }
运行时抛出了如下异常:
java.lang.invoke.WrongMethodTypeException: cannot convert MethodHandle(,UserOnlineEvent)void to (Event)void
其中UserOnlineEvent是测试使用的事件类型,我曾误以为是无法获取事件真实类型导致的问题。
解决方法
问题已解决:调用handle.invoke时需要传入两个参数,把listener作为第一个参数传入即可正常运行,修正后的调用代码为:
handle.invoke(listener, actualEventType.cast(event));
内容的提问来源于stack exchange,提问作者SNWCreations
相关产品推荐
相关产品推荐

