2

Java 7 は Java 6 コードを実行できますが、Java 6 は Java 7 固有のコード (NIO 2.0 など) を実行できません。いずれかの JVM を使用するユーザーをサポートしたいのですが、Java 7 ユーザーに追加機能を提供したいと考えています。

JVM が 1.6 の場合は Java 6 でコンパイルされたクラスを、JVM が Java 7 の場合は Java 7 でコンパイルされたクラスを条件付きでインスタンス化できるようなインターフェースを使用して、Java 6 で Factory クラスを構築することは可能ですか?

例:

String javaVersion = System.getProperty("java.version");
if (javaVersion.startsWith("1.6")) {
    myInterface = Class.forName("com.project.java6.MyInterfaceImplementation").newInstance();
} 
else {
    myInterface = Class.forName("com.project.java7.MyInterfaceImplementation").newInstance();
}

その場合、Java 6 でコンパイルされたコード用と Java 7 コード用の 2 つのバージョンを別々の jar にパッケージ化する必要がありますか?

4

2 に答える 2

0

さまざまな方法を試すことで、警告を発生させずにこれを行う 2 つの方法を見つけました。

Java 7 で Java 7 実装をビルドします。残りは Java 6 でビルドします。forName と newInstance を使用して Java 7 コードをインスタンス化します。

次のコンパイラ オプション '-source 1.6 -target 1.6 -bootclasspath [Java 7 path]/lib/rt.jar' を使用して、Java 7 を使用してすべてのコードをビルドします。すべてのコードは、Java 7 メソッドを使用するコードを含め、Java 6 メジャー バージョン 50 を取得します。この場合、Peter が述べたように、Java 6 コードは実装クラスを直接インスタンス化できます。

最初のケースでは、リフレクションは、Java 7 を使用していることを知るまで、クラスのロードを延期します。2 番目のケースでは、Java 7 を使用するクラスには適切なメジャー コードがあるため、どちらの JVM でもロードできますが、Java 7-特定のメソッドは、Java 7 を実行している場合にのみ呼び出されます。

于 2013-07-09T18:16:01.990 に答える