Javaでプリミティブ型のコンストラクタをリフレクションで呼び出す方法

こんにちは、さるまりんです。

以前、newInstance()メソッドを使ってClassオブジェクトからインスタンスを生成する方法について書いたことがあります。

その時は引数を取らないコンストラクタでオブジェクトを生成しました。

他のコンストラクタの場合はどうでしょうか?

クラスには引数をとるコンストラクタも実装できます。

例えばクラスSomeClassStringクラスの引数を1つとるコンストラクタSomeClass(String str)が用意されていたとします。

これを呼び出しインスタンスを生成するには次のようにします。

// Classクラスのオブジェクト
Class clazz = SomeObject.class;
// 引数情報を指定しコンストラクタを取得
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class);
// 取得されたコンストラクタを引数を指定して呼び出し
SomeObject object = (SomeObject) constructor.newInstance("文字列!");

コンストラクタを取得する時に渡す引数情報ですが、引数のClassクラスのオブジェクトのリストで指定します。

実際の生成はConstructorクラスのオブジェクトのnewInstance()メソッドを呼び出して行います。この時は引数の型情報ではなく実際にコンストラクタに渡す変数などを指定します。

上の例では引数は1つですが2つある時は2つ指定します。例えばStringクラスの引数を2つ取る場合は

clazz.getDeclaredConstructor(String.class, String.class)

として2つ指定します。

さて、地味に今回の本題です。

プリミティブ型の場合はどうでしょうか?

クラスSomeClassint型の引数を1つとるコンストラクタSomeClass(int i)が用意されていたとします。

このコンストラクターを取得する時は引数情報としてInteger.TYPEを指定します。

clazz.getDeclaredConstructor(Integer.TYPE)

Integer.TYPEはプリミティブ型intを表すClassクラスのオブジェクトです。

プリミティブ型を表すClassクラスのオブジェクトはそのラッパークラスのTYPEとして準備されています。

byteにはByte.TYPEbooleanにはBoolean.TYPEdoubleにはDouble.TYPEなどです。

TYPE、知らなかったです。

プリミティブ型をとるコンストラクタを呼び出す時、int型のクラスのオブジェクトってなんだ?とひとしきり悩んだのでメモしておきます。

読んでくださってありがとうございます。

それではまた!