[英]Why do I get a WrongMethodTypeException on invokeExact even though MethodHandle is OK
[英]Why a WrongMethodTypeException from MethodHandle? Is my object type incorrect?
我在嘗試將我的事件系統從反射切換到 MethodHandle 時遇到了問題。
我正在使用 KyoriPowered 在 Github ( https://github.com/KyoriPowered/event ) 上的事件總線(版本 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:無法將 MethodHandle(,UserOnlineEvent)void 轉換為 (Event)void
UserOnlineEvent 是測試中使用的事件類型。
問題是我無法獲得事件的真實類型。
編輯:這個問題已經解決。 我應該使用兩個 arguments。只需將偵聽器添加為 handle.invoke 的第一個參數,它就可以工作。
根據你的消息,我在JDK中找到了代碼。 在MethodHandle#asTypeUncached
/*non-public*/
MethodHandle asTypeUncached(MethodType newType) {
if (!type.isConvertibleTo(newType))
throw new WrongMethodTypeException("cannot convert "+this+" to "+newType);
return asTypeCache = MethodHandleImpl.makePairwiseConvert(this, newType, true);
}
很明顯,我猜參數類型是錯誤的。 如果調試,你會發現它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.