8

Java7の新しいバイトコード命令を使用して、Java言語の多重ディスパッチinvokedynamicを実装できるかどうか疑問に思いました。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の純粋な方法で実現できますか?)

4

2 に答える 2

2

私はinvokedynamicの経験がないので、パフォーマンスと型安全性がどれほど優れているかはわかりませんが、いくつかのポインターしか提供できません。

于 2012-06-17T09:19:48.027 に答える
1

命令invokedynamicは純粋にJVM命令であり、動的ディスパッチとは関係ありません。ディスパッチは、複数のメソッドハンドルインスタンスで構成されるメソッドハンドル(メソッドハンドルグラフとメソッドハンドルツリーもOKです)によって完了します。グラフ(ツリー)のパスは、1つのディスパッチパスを表します。

あなたの与えられたサンプルに対して、私はグラフを作成することができます(異なる人々は異なるグラフ結果を持っているかもしれません)。このグラフでは、グラフ内のメソッドハンドルのトラバースは、disptachが完了する方法です。

サンプルメソッドハンドルツリー

于 2014-11-12T03:45:20.480 に答える