Java 8 が lambdas から生成するバイトコードの種類について読んでいて、Java 5 がリリースされたときのことを思い出しました。当時、JDK 5 でコンパイルされたバイトコードを JRE 1.4 で実行できるように変換するRetroweaverやその他のツールがありました。
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 の一部が行ったように、すべてのラムダに対して匿名の内部クラスを生成します。