可変長引数のコンストラクタを持つクラスをコンストラクタのリフレクションで生成する
以下のようなコンストラクタの時、
public Sample(String...args) {
Constructor の newInstance メソッドは、newInstance(Object...) であるので、
以下のように、new Object[]{ } で括って渡さないとならない。
String[] ary = new String[] { "A", "B", "C" };
この ary を渡して生成する。
Sample sample = Sample.class.getConstructor(new Class<?>[]{ String[].class }) .newInstance(new Object[]{ ary });
上記の newInstance の記述を、 .newInstance(ary) としてはダメなのである。
newInstance(Object...) の実行の仕方は興味深いことに次のケースでは、new Object[]{ } で
括らずに済む。
可変長引数の前に、任意の指定型の引数がある場合、
public Sample(int num, String...args) {
先ほどの String[] ary と、int の値に 10 を指定する場合は、、
Sample sample = Sample.class.getConstructor(new Class<?>[]{ int.class, String[].class }) .newInstance(10, ary);
と実行できるのである。
もちろん、
.newInstance(new Object[]{ 10, ary });
と記述するのが正なのであろうが。この差異には当惑する。