我們可以用javap命令查看class文件的編譯版本,。
比如對Worke.class使用javap命令:javap -verbose Worker
我將看到Worker的反編譯結(jié)果。其中前幾行如下:
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 匯總下就知道對應(yīng)關(guān)系了。
JDK 編譯器版本 |
target 參數(shù) |
十六進制 minor.major |
十進制 minor.major |
jdk1.1.8 |
不能帶 target 參數(shù) |
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 參數(shù),,編譯時可以通過target參數(shù)來設(shè)置編譯時所使用的jdk版本,。比如如果目標(biāo) JVM 是 1.3 的話,編譯選項就可以用 -target 1.3 -source 1.3 了,。
相應(yīng)的如果使用 ant ,,編譯時可以通過target參數(shù)來設(shè)置編譯時所使用的jdk版本。比如:
<javac target="1.4" source="1.4" ............................/>
注2:javac中source和target 的意義
-source <版本> 提供與指定版本的源兼容性
-target <版本> 生成特定 VM 版本的類文件
source才是真正的指明代碼的兼容性,,target則是指定了生成class的格式的版本號,,即生成特定 VM 版本的類文件。