使用invokedynamic实现多个分派

时间:2012-06-13 12:34:24

标签: java dynamic overloading dispatch multiple-dispatch

我想知道是否可以使用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纯粹的方式实现吗?)

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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

sample method handle tree