我有一個關於合規模式的問題。 我的類擴展了一個基本的java類(例如Properties),並使用JDK5編譯並打包成jar。現在,我在一個使用JDK 6構建的項目中使用此jar,但處於遵從模式5. 現在有人可以在我的JDK6項目的類中使用新方法stringPropertyNames() - 這是JDK6中的新增功能?合規模式和重寫方法
3
A
回答
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
。
我希望你不會被淹沒的答案;)...
相關問題
- 1. Apache模式重寫規則Zeus重寫規則
- 2. Haskell重寫規則和函數組合
- 3. ANTLR的樹模式與重寫規則
- 4. Python的方法重寫規則
- 5. 以合適的方式讀取和寫入規則Firebase
- 6. ANTLR如何創建重寫規則重寫爲方法的值?
- 7. IIS重寫規則無法按預期方式工作
- 8. 方法寫作模式
- 9. javascript方法寫作模式
- 10. IIRF重寫Condintion和重寫規則
- 11. C++和虛方法重寫
- 12. 檢查超類/接口方法和等式的重寫方法
- 13. 的.htaccess和重寫規則
- 14. 無法寫入URL重寫規則
- 15. 結合的.htaccess重寫規則
- 16. URL重寫模塊模式
- 17. Magento - 重寫模板:替代方法?
- 18. 重寫規則
- 19. 重寫規則
- 20. 重寫規則
- 21. 什麼是方法合同和方法規範?
- 22. 重寫路徑和IIS集成模式
- 23. 構造中的重寫等式方法
- 24. IIS重寫模塊的web.config重寫規則更新不考慮
- 25. URL重寫模塊IIS7不正確處理重寫規則
- 26. IIS 7.5重寫與此URL重寫規則模塊循環
- 27. .htaccess重寫規則合併slu and和身份證
- 28. 寫GET方法在存儲庫模式
- 29. 600 +模式重寫規則,用apache可以嗎?
- 30. 重寫規則模式不能工作的權利
沒有,你的答案是非常好的:-)所以它是沒有意義的設置比-source選項更高-target選項? – lrxw 2012-02-06 07:26:17
你說得對。當編譯後的代碼被指定在JRE X('-target X')上運行時,沒有任何意義可以阻止來自java release X('-source X-1')的特性的使用,該特性允許這些特性。 – yair 2012-02-06 09:33:51
非常感謝:-) – lrxw 2012-02-06 10:11:58