想一想动态的、谓词方面的语言。可以调用方面(即方法)来代替或在原始方法之前和之后调用。这些方面在运行时打开和关闭。甚至可能是多个方面想要更改同一个方法,这将导致这些方面组合成一个方法调用链。
原始方法由加载时编译器(JPLIS 和 ASM)更改。我得到了一些看起来像这样的字节码:
//## baseMethod ##
aload 0 // this
aload ... // some more arguments
invokedynamic # // call the bootstrap method which returns a callsite to be invoked
有趣的部分是引导方法应该以特定方式工作:
- 返回具有兼容参数列表的方法串联。这些
MethodHandle
s 绑定到调用它们的不同类型的不同实例。 - 结果可能
MethodHandle
只是绑定到其他实例,而不是绑定到调用引导方法的实例。因此,应该省略使用this调用生成的调用站点(下面替代方案中的第一个分支)。
也有可能直接调用原来的方法,完全没问题。
在我看来,MethodHandle
s 是实现这一目标的正确方法。我的问题是,如果一切都可以在单个引导方法中实现,那么我可以使用从绑定到调用站点的引导方法返回的方法句柄链来链接方法调用,如序列图中所示。