使用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的应用。 这些幻灯片根本没有涉及细节,但我想我在一段关于JAX2012的视频或播客中看到了更多细节,而JAX2012目前还找不到。
  • Christopher Dutchyn的JVM Multiple Dispatch是没有invokedynamic的替代方法。 他的COOTS '01 Paper和这些幻灯片有很多表演信息/基准(并且在完成了解剖之后是一个很好的阅读;)

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

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

    样本方法句柄树

    链接地址: http://www.djcxy.com/p/10881.html

    上一篇: Use invokedynamic to implement multiple dispatch

    下一篇: is there any graph digitizer available?