使用invokedynamic实现多重dispatch
Posted
技术标签:
【中文标题】使用invokedynamic实现多重dispatch【英文标题】:Use invokedynamic to implement multiple 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?)? 奇怪的是这个问题很少受到关注:( 我应该开始赏金吗? 【参考方案1】:由于我没有使用invokedynamic的经验,不知道性能和类型安全性会有多好,只能指点一下:
the Da Vinci Machine Project 通过invokedynamic 提供多重分派(参见Multiple Dispatch/src/invokedynamicmultipledispatch/); 查尔斯·奥利弗·纳特有talked about applications of invokedynamic on JAX2012。幻灯片根本没有详细介绍,但我想我在谈论 JAX2012 的视频或播客中看到了更多细节,我现在找不到。 Christopher Dutchyn's JVM Multiple Dispatch 是一种没有调用动态的替代方法。 His COOTS '01 Paper 和 these slides 有很多性能信息/基准测试(在你完成论文后很好阅读;)【讨论】:
【参考方案2】:invokedynamic 指令纯属JVM 指令,与动态调度无关。调度由包含多个方法句柄实例的方法句柄(方法句柄图和方法句柄树也可以)完成。图(树)中的一条路径代表一个调度路径。
对于您给定的样本,我可能会构建一个图表(不同的人可能有不同的图表结果)。在这个图中,图中方法句柄的遍历就是disptach完成的方式。
【讨论】:
以上是关于使用invokedynamic实现多重dispatch的主要内容,如果未能解决你的问题,请参考以下文章
java lambda之方法句柄&invokedynamic指令
java lambda之方法句柄&invokedynamic指令