TL;DR
よく知られている動的言語 (JavaScript など) で記述されたコードの一部と、invokedynamic を使用した Java バイトコードでそのコードがどのように見えるかを提供し、invokedynamic の使用がここで一歩前進した理由を説明してください。
バックグラウンド
インターネット上の誰もがJVM上の動的言語の高速化に役立つことに同意する、それほど新しくはないinvokedynamic命令について、私はググってかなりの量を読みました。stackoverflow のおかげで、Sable/Jasmin を使用して独自のバイトコード命令を実行することができました。
私は、invokedynamic が遅延定数に役立つことを理解しました。また、OpenJDK が lambdas に対してどのように invokedynamic を利用するかを理解したと思います。
Oracleには小さな例がありますが、この場合のinvokedynamicの使用法を知る限り、「加算器」の例ははるかに単純で高速で、次のバイトコードで表現されるほぼ同じ効果を持つため、目的を無効にします。
aload whereeverAIs
checkcast java/lang/Integer
aload whereeverBIs
checkcast java/lang/Integer
invokestatic IntegerOps/adder(Ljava/lang/Integer;Ljava/lang/Integer;)Ljava/lang/Integer;
なんらかの理由で、Oracle のブートストラップ メソッドは両方の引数が整数であることを認識しているためです。彼らは次のことを「認めます」。
[..]引数が[..]整数オブジェクトになると仮定します。ブートストラップ メソッドのパラメーター (この例では、callerClass、dynMethodName、および dynMethodType) が異なる場合、ブートストラップ メソッドには、invokedynamic [..] を適切にリンクする追加のコードが必要です。
そうです、その興味深い「追加コード」がなければ、invokedynamic をここで使用しても意味がありませんね。
そのため、Javadoc とブログのエントリをいくつか追加した後、invokestatic/invokevirtual/invokevirtual または getfield が同様に機能する場合に、invokedynamic を適切な代替手段として使用する方法について、かなりよく理解していると思います。
今、実際にinvokedynamic命令を実際のユースケースに適用して、「従来の」呼び出しでできることを実際に改善する方法に興味があります(遅延定数を除く、私はそれらを手に入れました...)。