2011-07-14 82 views
27

JDK 7的哪些功能的向後兼容性使新的類文件版本,這是不符合JDK 6.接縫,所有特徵可以被實現(因爲它不使用java的不含invokedynamic)通過編譯器生成膠水代碼。例如switch語句中的String可以使用編譯器生成的重複ifeq語句來實現。我希望能夠將1.7的目標1.6標誌給編譯器以符合jre 6,同時在jdk 7中使用項目硬幣功能。JDK 7的類文件與JDK 6

+0

如果你看看與javap的字節碼或使用反編譯和逆向工程與JDK 7編譯器生成的.class文件,你會看到生成的「嘗試與資源」的代碼,「二進制文字」,「在文字unserscore」 ,「鑽石操作員」也是有效的JRE 6代碼。但多捕獲是錯誤的。 – Deniz

+13

現在JDK 7正式出來了,它顯然不支持將Java 7源文件編譯爲Java 6類文件:'javac -source 1.7 -target 1.6 Test.java'給出'javac:source release 1.7需要目標版本1.7'。我也有興趣瞭解爲什麼會出現這種情況。 –

+1

請參閱:http://www.oracle.com/technetwork/java/javase/compatibility-417013.html – scravy

回答

8

我沒有看過編譯器的代碼,但一些新的特點顯然必須對字節碼的影響。

「簡體可變參數方法調用」實際上只是一個警告制止,但必須留下一些標記的字節碼,這樣客戶端代碼可以顯示不同的警告。

「嘗試與 - 資源」生成代碼,能夠處理正常異常,加上最後塊過程中引發的第二異常。使用新的addSuppressed()方法存儲額外的例外。這不完全是一個類文件格式的改變,但它顯然不適用於早期的虛擬機。

「多抓」也產生字節碼這是細微的差別比以往任何編譯器可能會產生。異常表中的多個條目現在將指向同一個catch主體。

+0

多抓東西並不重要,因爲它仍然是有效的50.0字節碼。 – Antimony

+0

這裏有一些建議:http://stackoverflow.com/a/18368608/166524 – lapo

0

因此,讓我確保我明白這一點。你想在你的應用程序中針對不同的JRE運行一個特定的類,然後是所有其他的類嗎?我想這可能是理論上可行的,如果在每一次使用類的時候你不想使用不同的版本來創建一個單獨的JVM。這將涉及複雜度相當於在不相交的應用程序中的兩個JVM之間傳遞信息。開箱即用這種方式不起作用,因爲6中的執行環境不會了解項目硬幣功能。 IIRC你不能在1.4的運行時使用泛型,那麼它有什麼不同呢?在這一天結束時,它確實看起來不值得,然後我可能完全錯過了你的觀點。

+0

同意Woot4Moo。爲什麼不在JDK 7上重新編譯(特別是在月末出現時)?爲什麼要留在6?你有沒有指定的約束?即便如此,它可能比它值得的工作更多。如果你想要像String開關那樣的東西,那麼只需編寫簡單的if-else語句。他們是一樣可讀,並得到你需要在6 –

+5

@ Woot4Moo - 我想你可能誤解了這個問題。聽起來更像OP想要在1.7 *編譯器*中使用COIN特性,同時仍然生成可以運行在1.6 * JRE *的代碼。 @Chris,爲了兼容Java JRE和庫的舊版本,有時候有很好的理由進行編譯。 –

+0

是的,正如Andy Thomas-Cramer所說的,我想了解什麼是技術原因,我無法使用1.7編譯器指定-target 1.6編譯並使用項目硬幣功能。 – Deniz