【问题标题】:Use invokedynamic to implement multiple dispatch使用invokedynamic实现多重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?)?
  • 奇怪的是这个问题很少受到关注:(
  • 我应该开始赏金吗?

标签: java dynamic overloading dispatch multiple-dispatch


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 2016-10-02
      • 1970-01-01
      • 2020-07-01
      相关资源
      最近更新 更多