リフレクションで配列のインスタンスを作る

String hoge = {"1"};
String foo = (String[]) hoge.getClass().newInstance();

これがエラーになるとは知らなかった。getClass()の戻り値が配列を指してるからそのままnewInstance()できるかと思ったらできないのね…。確かに配列のインスタンスを作っているのに長さの指定ができないから妙だなとは思ったんだ。上記のサンプルコードじゃ何をしたいのか分からないけれどとりあえず配列のインスタンスを作るには以下のようにするらしい。

String hoge = {"1"};
int length = {hoge.length};
String[] foo = (String[]) Array.newInstance(hoge[0].getClass(), length);

をいをい、newInstance()の戻り値がObjectじゃないか!どうやって配列にするのよ…なんて思ったりもしたが、普通にキャストできる。hoge[0]あたりがもう少し綺麗に書けるはずだけどとりあえずやりたい事はできたので後回し。

Object[]を受け取って配列を再作成してObject[]で返す。その時、元の型を崩さないようにするにはどうしたらいいんだべさ?と思ってやってみた次第。後は新しくできたインスタンスにデータを設定してあげればOK。

最初にArrayクラスが出てきた時、パッケージがjava.utilか!?と思ったけどjava.lang.reflectでほっとした(笑)