在 ByteBuddy 生成的方法中,如何将作为参数接收的对象中的 (public) 实例字段设置为 MethodCall 的 return 值?

From a ByteBuddy-generated method, how do I set a (public) instance field in an object received as an argument to the return value of a MethodCall?

我正在 ByteBuddy 中生成一个 class。

作为一个方法实现的一部分,我想将另一个对象中的(假设)public 实例字段设置为 MethodCall 调用的 return 值。 (保留示例 public 意味着访问检查等无关紧要。)

我想我可以使用 MethodCall#setsField(FieldDescription) 来做到这一点。

但是从我的 中我了解到 MethodCall#setsField(FieldDescription) 仅适用于检测类型的字段,现在看,我不完全确定我为什么或如何以为它会起作用。

那么:有没有办法让 ByteBuddy 生成的方法实现将另一个对象的实例字段设置为方法调用的 return 值?

如果重要,“检测方法”(在 ByteBuddy 的术语中)接受我要将其字段设置为参数的对象。天真地我希望能够做类似的事情:

MethodCall.invoke(someMethod).setsField(somePublicField).onArgument(2);

这里可能存在我没有看到的问题,但我有点惊讶没有看到这个 DSL 选项。 (出于充分的理由,它可能不存在;我只是不知道它们会是什么。)

从 Byte Buddy 1.10.18 开始,这是不可能的,例如,该机制最初是为了在定义 bean 时支持 getters/setters 而创建的。也就是说,添加并不难;我认为允许任何自定义字节代码作为方法调用的使用者进行分派甚至是最简单的。

我会研究如何做到这一点,但作为一项新功能,这需要一些时间才能找到空 space 来做到这一点。变化是 tracked on GitHub.