JDK Class 版本識別表

2021-09-30 08:54:55 字數 2614 閱讀 9893

現在不妨從 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 的因素)

如何識別 SQL Server 的版本

本文介紹如何識別當前的 microsoft sql server 版本號和相應的產品或 service pack 級別。同時介紹如何識別正在使用的 sql server 具體版本。若要確定正在執行的 sql server 2008 為哪個版本,請使用 sql server management st...

FlinkSQL實踐 時態表 版本表

在flinksql關聯時,必然會涉及到維表,維表又可能是不斷變化的 aka 時態表 或 版本表 版本表 如果時態表中的記錄可以追蹤和並訪問它的歷史版本,這種表我們稱之為版本表,來自資料庫的 changelog 可以定義成版本表。普通表 如果時態表中的記錄僅僅可以追蹤並和它的最新版本,這種表我們稱之為...

HP UX 11i 版本名稱與版本識別碼

hp 的 hp ux 11i 提供高可用性 安全,可管理的作業系統,能符合端對端的關鍵性網際網路運算需求。hp ux 11i 版支援企業 enterprise 關鍵性任務 mission critical 和專業運算 technical computing 環境。pa risc 系統和以 intel...