使用invokedynamic实现多重派发

9
我想知道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的方式下实现?

在Java 7中使用MethodHandles可能值得一看,因为它们可以使用动态派遣。 - Peter Lawrey
好问题 (+1)。你的第一句话中是否缺少一个词(新添加了什么,CallSite)? - DaveFar
很奇怪这个问题得到的关注如此之少 :( - DaveFar
我应该开始悬赏吗? - DaveFar
2个回答

2

由于我没有使用invokedynamic的经验,所以我不知道性能和类型安全性如何,但只能给出一些指针:


1

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

对于您给出的示例,我可能会构建一个图(不同的人可能会得到不同的图结果)。在此图中,图中方法句柄的遍历是分派完成的方式。

sample method handle tree


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接