3

想一想动态的、谓词方面的语言。可以调用方面(即方法)来代替或在原始方法之前之后调用。这些方面在运行时打开和关闭。甚至可能是多个方面想要更改同一个方法,这将导致这些方面组合成一个方法调用链。

原始方法由加载时编译器(JPLIS 和 ASM)更改。我得到了一些看起来像这样的字节码:

//## baseMethod ##
aload 0         // this
aload ...       // some more arguments
invokedynamic # // call the bootstrap method which returns a callsite to be invoked

有趣的部分是引导方法应该以特定方式工作:

  • 返回具有兼容参数列表的方法串联。这些MethodHandles 绑定到调用它们的不同类型的不同实例。
  • 结果可能MethodHandle只是绑定到其他实例,而不是绑定到调用引导方法的实例。因此,应该省略使用this调用生成的调用站点(下面替代方案中的第一个分支)。

也有可能直接调用原来的方法,完全没问题。

在此处输入图像描述

在我看来,MethodHandles 是实现这一目标的正确方法。我的问题是,如果一切都可以在单个引导方法中实现,那么我可以使用从绑定到调用站点的引导方法返回的方法句柄链来链接方法调用,如序列图中所示。

4

1 回答 1

3

任何决定将哪些方面应用于方法调用的分支逻辑都必须在方法句柄执行时运行,而不是在引导时运行。

您可以通过以下方式组合各种句柄和分支逻辑
MethodHandles.guardWithTest​(test, target, fallback)

堆栈上的this将是句柄的参数之一。

于 2017-09-22T19:31:19.063 回答