45

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 の一部が行ったように、すべてのラムダに対して匿名の内部クラスを生成します。

4

1 に答える 1

44

現在、ラムダ式とメソッド参照を使用する Java 8 バイトコードを Java 7、6、または 5 で動作するように変換するためのRetrolambdaがあります。

于 2013-07-23T10:34:16.197 に答える