現在不妨從 jdk 1.1 到 jdk 1.7 編譯器編譯出的 class 的預設 minor.major version 吧。(又走到 sun 的**上翻騰出我從來都沒用過的古董來)
jdk 編譯器版本target 引數十六進製制 minor.major十進位制 minor.major
jdk1.1.8
不能帶 target 引數
00 03 00 2d
45.3
jdk1.2.2
不帶(預設為 -target 1.1)
00 03 00 2d
45.3
jdk1.2.2
-target 1.2
00 00 00 2e
46.0
jdk1.3.1_19
不帶(預設為 -target 1.1)
00 03 00 2d
45.3
jdk1.3.1_19
-target 1.3
00 00 00 2f
47.0
j2sdk1.4.2_10
不帶(預設為 -target 1.2)
00 00 00 2e
46.0
j2sdk1.4.2_10
-target 1.4
00 00 00 30
48.0
jdk1.5.0_11
不帶(預設為 -target 1.5)
00 00 00 31
49.0
jdk1.5.0_11
-target 1.4 -source 1.4
00 00 00 30
48.0
jdk1.6.0_01
不帶(預設為 -target 1.6)
00 00 00 32
50.0
jdk1.6.0_01
-target 1.5
00 00 00 31
49.0
jdk1.6.0_01
-target 1.4 -source 1.4
00 00 00 30
48.0
jdk1.7.0
不帶(預設為 -target 1.6)
00 00 00 32
50.0
jdk1.7.0
-target 1.7
00 00 00 33
51.0
jdk1.7.0
-target 1.4 -source 1.4
00 00 00 30
48.0
apache harmony 5.0m3
不帶(預設為 -target 1.2)
00 00 00 2e
46.0
apache harmony 5.0m3
-target 1.4
00 00 00 30
48.0
上面比較是 windows 平台下的 jdk 編譯器的情況,我們可以此作些總結:
1) -target 1.1 時 有次版本號,target 為 1.2 及以後都只用主版本號了,次版本號為 0
2) 從 1.1 到 1.4 語言差異比較小,所以 1.2 到 1.4 預設的 target 都不是自身相對應版本
3) 1.5 語法變動很大,所以直接預設 target 就是 1.5。也因為如此用 1.5 的 jdk 要生成目標為 1.4 的**,光有 -target 1.4 不夠,必須同時帶上 -source 1.4,指定原始碼的相容性,1.6/1.7 jdk 生成目標為 1.4 的**也如此。
4) 1.6 編譯器顯得較為激進,預設引數就為 -target 1.6。因為 1.6 和 1.5 的語法無差異,所以用 -target 1.5 時無需跟著 -source 1.5。
5) 注意 1.7 編譯的預設 target 為 1.6
6) 其他第三方的 jdk 生成的 class 檔案格式版本號同對應 sun 版本 jdk
7) 最後一點最重要的,某個版本的 jvm 能接受 class 檔案的最大主版本號不能超過對應 jdk 帶相應 target 引數編譯出來的 class 檔案的版本號。
上面那句話有點長,一口氣讀過去不是很好理解,舉個例子:1.4 的 jvm 能接受最大的 class 檔案的主版本號不能超過用 1.4 jdk 帶引數 -target 1.4 時編譯出的 class 檔案的主版本號,也就是 48。
因為 1.5 jdk 編譯時預設 target 為 1.5,出來的位元組碼 major.minor version 是 49.0,所以 1.4 的 jvm 是無法接受的,只有丟擲錯誤。
那麼又為什麼從 1.1 到 1.2、從 1.2 到 1.3 或者從 1.3 到 1.4 的 jdk 公升級不會發生 unsupported major.minor version 的錯誤呢,那是因為 1.2/1.3/1.4 都保持了很好的二進位制相容性,看看 1.2/1.3/1.4 的預設 target 分別為 1.1/1.1/1.2 就知道了,也就是預設情況下1.4 jdk 編譯出的 class 檔案在 jvm 1.2 下都能載入執行,何況於 jvm 1.3 呢?(當然要去除使用了新版本擴充的 api 的因素)
六:找到問題解決的方法
怎樣檢視class檔案的jdk版本號
1 事先編譯好乙個class檔案。如 testversion.class 2 使用ultraedit或editplus開啟class檔案,我這裡使用的editplus,如圖 3 開啟時encoding選擇hex viewer,以16進製制方式顯示 4 開啟檔案的內容例如以下 5 僅僅看第一行資料,前...
版本號簡述
版本號簡介 版本號一般分為major 主版本號 minor 次版本號 revision incremental 修正版本號 一般格式為major.minor.revison 如何界定軟體什麼時候該用什麼樣的版本號呢?1 專案初版本時 版本號可以為 0.1 或 0.1.0,也可以為 1.0 或 1.0...
比較版本號
題目 比較兩個版本號 version1 和 version2。如果 version1 version2 返回 1,如果 version1 version2 返回 1,除此之外返回 0。你可以假設版本字串非空,並且只包含數字和 字元。字元不代表小數點,而是用於分隔數字序列。例如,2.5 不是 兩個半 ...