使用invokedynamic实现多重dispatch

Posted

技术标签:

【中文标题】使用invokedynamic实现多重dispatch【英文标题】:Use invokedynamic to implement multiple dispatch 【发布时间】:2012-06-16 09:54:45 【问题描述】:

我想知道是否可以使用 Java7 的新 invokedynamic 字节码指令来实现 Java 语言的 multiple dispatch。 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 的方式实现吗?)

【问题讨论】:

Java 7 中的 MethodHandles 可能值得一看,因为它们可以使用动态调度。 好问题(+1)。您的第一句话中是否缺少一个单词(新添加了什么,CallSite?)? 奇怪的是这个问题很少受到关注:( 我应该开始赏金吗? 【参考方案1】:

由于我没有使用invokedynamic的经验,不知道性能和类型安全性会有多好,只能指点一下

the Da Vinci Machine Project 通过invokedynamic 提供多重分派(参见Multiple Dispatch/src/invokedynamicmultipledispatch/); 查尔斯·奥利弗·纳特有talked about applications of invokedynamic on JAX2012。幻灯片根本没有详细介绍,但我想我在谈论 JAX2012 的视频或播客中看到了更多细节,我现在找不到。 Christopher Dutchyn's JVM Multiple Dispatch 是一种没有调用动态的替代方法。 His COOTS '01 Paper 和 these slides 有很多性能信息/基准测试(在你完成论文后很好阅读;)

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于使用invokedynamic实现多重dispatch的主要内容,如果未能解决你的问题,请参考以下文章

invokedynamic指令

java7 invokedynamic命令研究

java lambda之方法句柄&invokedynamic指令

java lambda之方法句柄&invokedynamic指令

java lambda之方法句柄&invokedynamic指令

关于Class的invokeDynamic指令