繁体   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