使用invokedynamic实现多个分派

我想知道Java7的新invokedynamic字节码指令是否可用于实现Java语言的多个调度 。 java.lang.invoke下的新API是否有助于执行此类操作?

我考虑的场景如下所示。 (这看起来像访问者设计模式的应用案例,但可能有理由认为这不是一个可行的选择。)

 class A {} class A1 extends A {} class A2 extends A {} class SomeHandler { private void doHandle(A1 a1) { ... } private void doHandle(A2 a2) { ... } private void doHandle(A a) { ... } public void handle(A a) { MultipleDispatch.call(this, "doHandle", a); } } 

那么库类MultipleDispatch会做类似的事情:

 class MultipleDispatch { public static Object call(Object receiver, String method, Object...arg) { // something like that in byte code #invokeDynamic "doHandle" "someBootstrap" } static CallSite someBootstrap { // resolve that dynamic method call. } } 

(我知道MultiJava ,但这可以用纯Java方式实现吗?)

由于我没有使用invokedynamic的经验,我不知道性能和类型安全性有多好,但只能给出一些指示

  • 达芬奇机器项目通过invokedynamic提供多个调度(参见Multiple Dispatch / src / invokedynamicmultipledispatch /);
  • Charles Oliver Natter 在JAX2012上谈到了invokedynamic的应用 。 幻灯片根本没有详细介绍,但我想我在video或播客中发现了更多关于JAX2012的细节,我现在找不到它。
  • Christopher Dutchyn的JVM Multiple Dispatch是一种没有invokedynamic的替代方法。 他的COOTS ’01论文和这些幻灯片有很多性能信息/基准测试(在你完成解剖之后是一个很好的阅读;)

invokedynamic指令纯粹是一个JVM指令,它与动态调度无关。 调度由方法句柄(方法句柄图和方法句柄树也可以)完成,它包含多个方法句柄实例。 图(树)中的路径表示一个调度路径。

对于您的给定样本,我可以构建一个图形(不同的人可能有不同的图形结果)。 在此图中,图中方法句柄的遍历是disptach完成的方式。

示例方法句柄树