java class version の生成と互換性について

ちょっと調べたけど見つからなかったんでメモっとく。

> javac (オプション) 適当な.java

コンパイルして、どういうバージョンのが出来るか。java classファイルの先頭が

CA FE BA BE xx xx xx xx

となっており、この4バイトがバージョン。JDK各バージョンにおけるこの値のデフォルト値と、-source/-targetオプションでどう変わるかをチェックしてみた。尚、JDKは全てWindows版を用い、それぞれのバージョンの現時点での最新版を使用した。

結果:

1.5.0 : 00 00 00 31 (49.0) なし
1.5.0 : -target 1.4 コンパイルできず
1.5.0 : 00 00 00 30 (48.0) -source 1.4 -target 1.4
1.4.2 : 00 00 00 30 (48.0) -target 1.4
1.4.2 : 00 00 00 2F (47.0) -target 1.3
1.4.2 : 00 00 00 2E (47.0) -target 1.2
1.4.2 : 00 00 00 2E (46.0) なし
1.4.2 : 00 03 00 2D (45.3) -target 1.1
1.4.2 : -taget 1.0 コンパイルできず
1.3.1 : 00 00 00 2F (47.0) -target 1.3
1.3.1 : 00 00 00 2E (47.0) -target 1.2
1.3.1 : 00 03 00 2D (45.3) -target 1.1
1.3.1 : 00 03 00 2D (45.3) なし

つまり、

1.1まで 45.3
1.2 46.0
1.3 47.0
1.4 48.0
1.5 49.0

がclass versionみたい。また、それぞれのバージョンでのデフォルトclass versionも、結構変化していておもしろいなと。

あ、片手間で調べたんでもしかしたらマチガッテルかも。