2012-02-02 13 views
3

準拠モードについて質問があります。 基本的なJavaクラス(例えばProperties)を拡張し、JDK5でコンパイルしてjarファイルにパッケージ化したクラスではどうなりますか?今私はJDK 6でコンプライアンスモード5でビルドされたプロジェクトでこのjarを使用します。 誰かがJDK6プロジェクトのクラスで新しいメソッドstringPropertyNames()を使用できるようになりましたか?準拠モードとオーバーライドメソッド

答えて

3

これは、JRE 6 JVMでプロジェクトを実行している限り、です。また、プロジェクトをJava 1.5に準拠してコンパイルする必要はありません。つまり、プロジェクトをコンパイルするときに、-source 1.5または-target 1.5のオプションを使用する必要はありません。一方、

あなたはJRE 5 JVM上で実行されている投影し、それは関係なく、プロジェクトのコンパイル時に使用されるオプションの

java.lang.NoSuchMethodError:B.stringPropertyNames()Ljava/util/Set; 

で失敗します。

実行時に発生することは、JVMが対応する実行バイトコードをProperties.stringPropertyNames()で検索していることです。 JRE 6上で実行している場合、そのようなコードは存在します(コンパイルでどのオプションが使用されたかにかかわらず)。 JRE 5で実行しているときは、存在しません。

私はあなたが提案したシナリオを確認:

B.java:

public class B extends Properties { 

    public B() { 
     setProperty("a", "aaa"); 
     setProperty("b", "bbb"); 
    } 
} 

C.java:

public class C { 

    public static void main(String[] args) { 
     B b = new B(); 
     System.out.println(b.stringPropertyNames()); 
    } 
} 

は、次の出力はどちらか、JDK 6でコンパイルし、同じようになりました-source 1.5および/または-target 1.5を使用するかどうかを指定します。 JVM 6上

出力:

[b, a] 

JVM 5の出力:

Exception in thread "main" java.lang.NoSuchMethodError: B.stringPropertyNames()Ljava/util/Set; 
     at C.main(C.java:17) 

それでは、なぜ全くのコンパイルに-source-targetを使うのか?

This siteは、-sourceオプションを使用すると、指定したリリースより後のリリースの特定の機能が使用されている場合にコンパイラを失敗させることが簡単に説明されています。たとえば、-source 1.4は、ジェネリックを使用しないようにします(実行時にのみ失敗する)。

-targetのオプションは、official docsに従って、他の(以前の)JVMでコンパイル済みコードを実行できるようにします。たとえば、JDK 6を使用してコードをコンパイルしても、JVM 5で実行する必要がある場合は、コンパイル時に-target 5を使用します。私がしなければ、私はjava.lang.UnsupportedClassVersionError: Bad version number in .class fileを得るでしょう。

私はあなたが答えに圧倒していない願っています。それは-sourceオプションよりも高い-targetオプションを設定する意味がないので)...

+0

はありません、あなたの答えは非常に良い:-)でしたか? – lrxw

+0

あなたはそうです。コンパイルされたコードがJRE X( '-target X')上で実行されるように指定されている場合、JavaリリースX(' -source X-1')からの機能の使用を妨げることはありません。 – yair

+0

ありがとうalot :-) – lrxw