JDK編譯的版本號列表

2021-09-02 09:51:07 字數 2664 閱讀 6349

現在不妨從 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 不是 兩個半 ...