簡體   English   中英

Java 8 | 在字段上動態使用 MethodHandle#invokeExact

[英]Java 8 | Using MethodHandle#invokeExact on fields dynamically

我的目標是創建一個 MethodHandle,通過傳遞 class 和字段名稱,使用 MethodHandle getter 讀取該字段並返回值。

使用這種方法,我想返回任意 object:

return new ConstantCallSite(MethodHandles.lookup().unreflectGetter(f).asType(MethodType.methodType(Object.class))).dynamicInvoker();

我通過 Reflections 收到了 Field f。 現在的問題是,當這個方法被執行時,典型的invokeExact(WrongMethodTypeException)錯誤出現了:

WrongMethodTypeException: cannot convert MethodHandle(TestClass)String to ()Object

這也適用於整數、浮點數等。在另一個線程中,我還讀到如果 MethodHandle 的返回更改為 Object,您可以動態使用 invokeExact。 這是該方法的代碼片段,它使用了傳遞 static 最終 MethodHandle:

return (T) handle.invokeExact(testObject);

使用 MethodHandle#invoke 對我來說是不可能的,因為我追求的是性能。 如果沒有 invokeExact,我也可能只能使用反射。

有誰知道這樣做的方法或具有類似性能的解決方法? 后者在該項目中起着重要作用。 我提前感謝那些可能幫助解決這個問題的人。

(非靜態)getter 需要一個實例來從中檢索字段的值。 您應該能夠通過將另一個Object參數添加到已擦除方法類型來完成此工作:

return MethodHandles.lookup().unreflectGetter(f).asType(MethodType.methodType(Object.class, Object.class));

(另外,沒有必要將東西包裝在ConstantCallsite中)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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