こんにちは、さるまりんです。
以前、newInstance()
メソッドを使ってClass
オブジェクトからインスタンスを生成する方法について書いたことがあります。
その時は引数を取らないコンストラクタでオブジェクトを生成しました。
他のコンストラクタの場合はどうでしょうか?
クラスには引数をとるコンストラクタも実装できます。
例えばクラスSomeClass
にString
クラスの引数を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つ指定します。
さて、地味に今回の本題です。
プリミティブ型の場合はどうでしょうか?
クラスSomeClass
にint型
の引数を1つとるコンストラクタSomeClass(int i)
が用意されていたとします。
このコンストラクターを取得する時は引数情報としてInteger.TYPE
を指定します。
clazz.getDeclaredConstructor(Integer.TYPE)
Integer.TYPE
はプリミティブ型int
を表すClass
クラスのオブジェクトです。
プリミティブ型を表すClass
クラスのオブジェクトはそのラッパークラスのTYPE
として準備されています。
byte
にはByte.TYPE
、boolean
にはBoolean.TYPE
、double
にはDouble.TYPE
などです。
TYPE
、知らなかったです。
プリミティブ型をとるコンストラクタを呼び出す時、int
型のクラスのオブジェクトってなんだ?とひとしきり悩んだのでメモしておきます。
読んでくださってありがとうございます。
それではまた!