You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 15:30:59