-2

对于我使用 aspectJ 和 invokedynamic 的工作,当切入点与被调用的方法匹配时,我需要将通知编织到方法中。首先,我将脚本中的 invokedynamic-instruction 的引导方法与我自己的进行了交换。现在在我的引导方法中,我想返回一个 CallSite,它首先调用被调用的方法,然后是我定义的建议。

问题是我必须返回一个由 ONE MethodHandle 构建的 CallSite ,其类型签名与原始引导方法中使用的类型签名相同。我考虑过将两个方法句柄(原始 + 建议)组合成一个新的方法句柄,并将其用于返回的 CallSite。但我找不到正确的方法来做到这一点。MethodHandles.foldArguments 似乎很有希望,但它对我不起作用。另一个想法是从调用原始方法句柄和建议的包装方法构建 MethodHandle,但问题是正确的类型签名。

有没有人对我有想法或建议?如何使用建议修补 MethodHandle?

谢谢你。

4

2 回答 2

1

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

于 2013-01-16T13:52:24.000 回答
1

我已经用 MethodHandles.guradwithtest 尝试过它并且它有效。但它不是很方便,只能在原始方法句柄之前调用某些东西。

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

于 2013-01-22T19:05:24.403 回答