2012-02-02 57 views
3

我有一個關於合規模式的問題。 我的類擴展了一個基本的java類(例如Properties),並使用JDK5編譯並打包成jar。現在,我在一個使用JDK 6構建的項目中使用此jar,但處於遵從模式5. 現在有人可以在我的JDK6項目的類中使用新方法stringPropertyNames() - 這是JDK6中的新增功能?合規模式和重寫方法

回答

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可確保您不使用泛型(否則將只在運行時失敗)。

根據official docs-target選項用於啓用在其他(較早的)JVM上執行編譯代碼。例如,如果我使用JDK 6來編譯我的代碼,但是我需要它在JVM 5上運行,那麼在編譯時我會使用-target 5。如果我沒有,我會得到java.lang.UnsupportedClassVersionError: Bad version number in .class file

我希望你不會被淹沒的答案;)...

+0

沒有,你的答案是非常好的:-)所以它是沒有意義的設置比-source選項更高-target選項? – lrxw 2012-02-06 07:26:17

+0

你說得對。當編譯後的代碼被指定在JRE X('-target X')上運行時,沒有任何意義可以阻止來自java release X('-source X-1')的特性的使用,該特性允許這些特性。 – yair 2012-02-06 09:33:51

+0

非常感謝:-) – lrxw 2012-02-06 10:11:58