我們可以用javap命令查看class文件的編譯版本。比如對Worke.class使用javap命令:javap -verbose Worker
我將看到Worker的反編譯結果。其中前幾行如下:
Compiled from "Worker.java"
public class com.teleca.robin.Worker extends java.lang.Thread
SourceFile: "Worker.java"
minor version: 0
major version: 49
Constant pool:
上面的minor version: 0和major version: 49就是編譯Worke.class時使用的jdk編譯版本號。
但是它并不是我們所熟悉的jdk版本號(比如jdk1.5)。
不過我們可以把從 JDK 1.1 到 JDK 1.7 編譯器編譯出的 class 的默認 minor.major version 匯總下就知道對應關系了。
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
|
注1:javac 有個 -target 參數,編譯時可以通過target參數來設置編譯時所使用的jdk版本。比如如果目標 JVM 是 1.3 的話,編譯選項就可以用 -target 1.3 -source 1.3 了。相應的如果使用 ant ,編譯時可以通過target參數來設置編譯時所使用的jdk版本。比如:
<javac target="1.4" source="1.4" ............................/>
注2:javac中source和target 的意義
-source <版本> 提供與指定版本的源兼容性
-target <版本> 生成特定 VM 版本的類文件source才是真正的指明代碼的兼容性,target則是指定了生成class的格式的版本號,即生成特定 VM 版本的類文件。