iモード携帯電話用Java(iアプリ) Part 4
Javaは配列を初期化する効率のいい方法を持ってないので、
そういうのは問答無用で代入の羅列に展開されてしまいます。例えばこんな。
public class Hoge {
public void fuga() {
int[] piyo = { 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48 };
}
}
コンパイルして逆アセンブルした結果↓
public void fuga()
{
int ai[] = {
65, 66, 67, 68, 69, 70, 71, 72
};
// 0 0:bipush 8
// 1 2:newarray int[]
// 2 4:dup
// 3 5:iconst_0
// 4 6:bipush 65
// 5 8:iastore
---------------------(略)---------------------------------
// 30 40:dup
// 31 41:bipush 7
// 32 43:bipush 72
// 33 45:iastore
// 34 46:astore_1
// 35 47:return
}
文字列リテラルで格納すると、
public class Hoge {
public void fuga() {
String piyo = "\u0041\u0042\u0043\u0044\u0045\u0046\u0047\u0048";
}
}
同じ情報量でもこうなる。
public void fuga()
{
String s = "ABCDEFGH";
// 0 0:ldc1 #2 <String "ABCDEFGH">
// 1 2:astore_1
// 2 3:return
}
ちなみにクラスファイルには、\u0001〜\u007fは1バイト、
\u0000と\u0080〜\u07ffは2バイト、\u0800〜\uffffは3バイトで格納されます。