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