Java 方法句柄操作

Java 方法句柄操作,java,aspectj,java-7,invokedynamic,methodhandle,Java,Aspectj,Java 7,Invokedynamic,Methodhandle,在我使用aspectJ和InvokedDynamic的工作中,当切入点与被调用的方法匹配时,我需要将通知编织到方法中。 首先,我将脚本中invokedynamic指令的bootstrapmethod与我自己的指令交换。现在在我的bootstrap方法中,我想返回一个CallSite,它首先调用被调用的方法,然后返回我定义的通知 问题是,我必须返回一个方法句柄的CallSite构建,该方法句柄的类型签名与原始bootstrapmethod中使用的类型签名相同。 我考虑将两个methodhandle

在我使用aspectJ和InvokedDynamic的工作中,当切入点与被调用的方法匹配时,我需要将通知编织到方法中。 首先,我将脚本中invokedynamic指令的bootstrapmethod与我自己的指令交换。现在在我的bootstrap方法中,我想返回一个CallSite,它首先调用被调用的方法,然后返回我定义的通知

问题是,我必须返回一个方法句柄的CallSite构建,该方法句柄的类型签名与原始bootstrapmethod中使用的类型签名相同。 我考虑将两个methodhandles(原始+建议)组合成一个新的methodhandles,并将其用于返回的CallSite。但是我找不到正确的方法。MethodHandles.foldArguments似乎很有前途,但对我来说不起作用。 另一个想法是从调用原始MethodHandle和通知的wrappermethod构建MethodHandle,但问题是正确的类型签名

有人对我有什么想法或建议吗?如何用建议修补MethodHandle


谢谢。

后期处理最简单的方法是使用MethodHandles#filterReturnValue。这允许执行目标方法,然后对返回值进行筛选。你可以简单地返回输入的内容,并根据你的建议做任何你需要做的事情。当然,您需要进行类型转换以将这些类型组合在一起,但这不应该是一个大问题。对于预处理,我可能会过滤一个参数,我在之前添加了这个参数,然后删除它

我已经用MethodHandles.guradwithtest尝试过了,效果很好。但是它不是很方便,只能在原始methodhandle之前调用一些东西

但现在我用另一种方法解决了。 我制作了一个wrappermethod,它获取methodhandles并以所需的方式调用它们。 然后我将包装器方法作为MethodHandle并插入参数。 然后是wrappermethod.asCollector(…)和wrappermethod.asType(…) 就这样。 对不起,解释得这么简短。
您可以询问更多详细信息。

您有没有尝试过的代码?当然有。但是,它是太多的交叉提供它在这里和我的问题是一个概念性的性质。将两个MethodHandle组合成一个新的MethodHandle的方法会是什么样子?