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も、結構変化していておもしろいなと。
あ、片手間で調べたんでもしかしたらマチガッテルかも。