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バイトで格納されます。