-->

使用invokedynamic实现多分派(Use invokedynamic to implemen

2019-07-29 22:06发布

我想知道,如果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的纯粹的方式实现吗?)

Answer 1:

因为我有invokedynamic没有经验,我不知道该怎么好性能和类型安全会是这样,但只能给一些指针

  • 达芬奇机项目提供通过invokedynamic多分派(见多分派/ src目录/ invokedynamicmultipledispatch /);
  • 查尔斯·奥利弗Natter酒店已经谈到了JAX2012的invokedynamic应用 。 幻灯片不赘述了所有,但我想我是在视频或播客在更多的细节来谈论JAX2012,我现在无法找到。
  • 克里斯托弗Dutchyn的JVM多分派是没有invokedynamic一种替代方法。 他COOTS '01纸和这些幻灯片有很多性能信息/基准的(并且是一个良好的阅读你完成你的disseration后;)


Answer 2:

该指令invokedynamic纯粹是一个JVM指令,它不涉及到动态调度。 调度是由方法处理完成(方法手柄图形和方法操作的树也行。),其包括多个方法手柄实例。 在曲线图(树)的路径代表一个调度路径。

为了您给定的样本,我想可能构建一个图(不同的人可能有不同的图形结果)。 在该图中,方法的遍历处理的图是disptach如何完成的方式。



文章来源: Use invokedynamic to implement multiple dispatch