読むJava 8はラムダからどのようなバイトコードを生成するのか、Java 5がリリースされたときのことを思い出しました。当時はレトロウィーバーそしてその他のツールJDK 5 でコンパイルされたバイトコードを JRE 1.4 で実行できるように変換します。
Java 8 ラムダ用のこのようなバックポート ツールを作成した人はいますか?これにより、Java 開発者は、Java 8 の GA リリースまで 6 ~ 12 か月待つことなく、本番品質の Java 7 JRE で今日からラムダを使い始めることができます。
バックポーターのようなものが比較的簡単に実装できる理由についての私の分析は次のとおりです。
Java 8 のラムダは、Java 7 にはない JVM 機能 (例invokedynamic
) は使用していないようです。また、java.lang.invoke.LambdaMetafactory
クラスとその依存関係は純粋な Java のように見えるため、サードパーティのライブラリで実装できるはずです。したがって、JDK 8 でコンパイルされたバイトコードは、LambdaMetafactory のコピー (別のパッケージの下) を含むサードパーティのライブラリを追加し、代わりにそのメタファクトリを使用するようにバイトコードを変換することで、JRE 7 で実行できるようになります。また、java.lang.invoke.MagicLambdaImpl
示唆されているように、アクセシビリティ チェックを回避するために合成クラスとメソッドもいくつか生成するかもしれません。または、ラムダ対応の最初のアーリー アクセス JDK の一部が行ったように、すべてのラムダに対して匿名の内部クラスを生成します。
ベストアンサー1
今はレトロラムダラムダ式とメソッド参照を使用する Java 8 バイトコードを Java 7、6、または 5 で動作するように変換します。(Java 1.4 では検証エラーが発生しました。それ以上調査しませんでした。)