JDK 7のどの機能(Javaでは使用されないためinvokedynamicを除く)により、JDK6に準拠していない新しいクラスファイルバージョンが発生します。すべての機能は、グルーコードを生成するコンパイラによって実装できると考えられます。たとえば、switchステートメントのStringは、コンパイラーによって生成された繰り返しのifeqステートメントを使用して実装できます。jre6に準拠するようにコンパイラーに-source1.7-target 1.6フラグを与え、同時にjdk7のプロジェクトコイン機能を使用できるようにしたいと思います。
2 に答える
コンパイラのコードを読んでいませんが、新機能のいくつかは明らかにバイトコードに影響を与えるはずです。
「簡略化されたvarargsメソッドの呼び出し」は実際には単なる警告抑制ですが、クライアントコードが警告を異なる方法で表示できるように、バイトコードにマーカーを残す必要があります。
「Try-with-resources」は、通常の例外に加えて、finallyブロック中にスローされた2番目の例外を処理できるコードを生成します。追加の例外は、新しいaddSuppressed()メソッドを使用して保存されます。これは正確にはクラスファイル形式の変更ではありませんが、以前のVMでは明らかに機能しません。
「マルチキャッチ」は、以前のコンパイラが生成できるものとは微妙に異なるバイトコードも生成します。例外テーブルの複数のエントリが同じキャッチボディを指すようになります。
それで、私がこれを理解していることを確認させてください。アプリケーションで特定のクラスを別のJREに対して実行し、次に他のすべてのクラスを実行したいですか?別のバージョンを使用したくないクラスを使用するたびに、別のJVMを起動する場合、これは理論的には可能であると思います。これには、互いに素なアプリケーションの2つのJVM間で情報を渡すのと同等のレベルの複雑さが含まれます。6の実行環境はプロジェクトのコイン機能を認識しないため、箱から出してこのように機能することはありません。IIRCは、1.4ランタイムではジェネリックを使用できないので、これはどのように異なりますか?結局のところ、それは本当に価値がないように思われます、そしてまた多分私はあなたのポイントを完全に逃しました。