首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在字段上动态使用MethodHandle#invokeExact

在字段上动态使用MethodHandle#invokeExact
EN

Stack Overflow用户
提问于 2022-08-31 20:54:21
回答 1查看 47关注 0票数 0

我的目标是创建一个MethodHandle,通过传递类和字段名,使用MethodHandle getter读取该字段并返回值。

使用此方法,我希望返回一个任意对象:

代码语言:javascript
复制
return new ConstantCallSite(MethodHandles.lookup().unreflectGetter(f).asType(MethodType.methodType(Object.class))).dynamicInvoker();

我通过反射接收到了f场。现在的问题是,在执行此方法时,invokeExact (WrongMethodTypeException)的典型错误发生:

代码语言:javascript
复制
WrongMethodTypeException: cannot convert MethodHandle(TestClass)String to ()Object

在另一个线程中,我已经看到,如果将invokeExact的返回更改为Object,您可以动态地使用MethodHandle。下面是该方法的一个代码片段,它利用传递一个静态的最终MethodHandle:

代码语言:javascript
复制
return (T) handle.invokeExact(testObject);

对我来说,使用MethodHandle#invoke是不可能的,因为我追求性能。如果没有invokeExact,我也可能只使用反射。

有谁知道做这件事的方法或类似表现的解决办法吗?后者在该项目中发挥着重要作用。我事先感谢那些可能帮助解决这一问题的人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-31 21:10:46

一个(非静态的) getter需要一个实例来检索字段的值。您应该能够通过向擦除的方法类型添加另一个Object参数来完成这项工作:

代码语言:javascript
复制
return MethodHandles.lookup().unreflectGetter(f).asType(MethodType.methodType(Object.class, Object.class));

(而且,不需要将其包装在ConstantCallsite中)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73561802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档