簡體   English   中英

為什么來自 MethodHandle 的 WrongMethodTypeException? 我的 object 類型不正確嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM