gpt4 book ai didi

java - 使用 MethodHandles 和 invokedynamic 链接方法调用

转载 作者:行者123 更新时间:2023-11-30 07:51:54 27 4
gpt4 key购买 nike

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

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

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

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

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

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

enter image description here

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

最佳答案

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

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

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

关于java - 使用 MethodHandles 和 invokedynamic 链接方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46368186/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com