使用invokedynamic实现多个调度 [英] Use invokedynamic to implement multiple dispatch

查看:167
本文介绍了使用invokedynamic实现多个调度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想知道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静态对象调用(Object receiver,String method,Object ... arg){
//这样的字节码
#invokeDynamicdoHandlesomeBootstrap
}

static CallSite someBootstrap {
//解析动态方法调用。
}
}

(我知道 MultiJava ,但可以以纯Java的方式实现吗?)

解决方案

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




I wondered if Java7's new invokedynamic bytecode instruction could be used to implement multiple dispatch for the Java language. Would the new API under java.lang.invoke be helpful to perform such a thing?

The scenario I was thinking about looked as follows. (This looks like an application case for the visitor design pattern, but there may be reasons that this is not a viable option.)

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);
    }
}

The library class MultipleDispatch would then do something of the kind:

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.
    }
}

(I am aware of MultiJava, but can this be achieved in a Java-pure fashion?)

解决方案

Since I have no experience with invokedynamic, I do not know how good the performance and type-safety would be, but can only give some pointers:

这篇关于使用invokedynamic实现多个调度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆