【问题标题】:MethodHandle Manipulation方法句柄操作
【发布时间】:2012-12-19 19:27:02
【问题描述】:

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

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

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

谢谢。

【问题讨论】:

  • 你有没有试过的代码?
  • 是的,当然。但是在这里提供它太多交联了,我的问题更多是概念性的。将两个方法句柄组合成一个新方法句柄的方法看起来如何?

标签: java aspectj java-7 invokedynamic methodhandle


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我已经使用 MethodHandles.guradwithtest 进行了尝试,它可以工作。但它不是很方便,只能在原始方法句柄之前调用一些东西。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2013-06-13
      • 1970-01-01
      • 2022-01-14
      相关资源
      最近更新 更多