我的目标是创建一个MethodHandle,通过传递类和字段名,使用MethodHandle getter读取该字段并返回值。
使用此方法,我希望返回一个任意对象:
return new ConstantCallSite(MethodHandles.lookup().unreflectGetter(f).asType(MethodType.methodType(Object.class))).dynamicInvoker();我通过反射接收到了f场。现在的问题是,在执行此方法时,invokeExact (WrongMethodTypeException)的典型错误发生:
WrongMethodTypeException: cannot convert MethodHandle(TestClass)String to ()Object在另一个线程中,我已经看到,如果将invokeExact的返回更改为Object,您可以动态地使用MethodHandle。下面是该方法的一个代码片段,它利用传递一个静态的最终MethodHandle:
return (T) handle.invokeExact(testObject);对我来说,使用MethodHandle#invoke是不可能的,因为我追求性能。如果没有invokeExact,我也可能只使用反射。
有谁知道做这件事的方法或类似表现的解决办法吗?后者在该项目中发挥着重要作用。我事先感谢那些可能帮助解决这一问题的人。
发布于 2022-08-31 21:10:46
一个(非静态的) getter需要一个实例来检索字段的值。您应该能够通过向擦除的方法类型添加另一个Object参数来完成这项工作:
return MethodHandles.lookup().unreflectGetter(f).asType(MethodType.methodType(Object.class, Object.class));(而且,不需要将其包装在ConstantCallsite中)
https://stackoverflow.com/questions/73561802
复制相似问题