このようなクラスをインスタンス化しています。
myObj = (myObj) Class.forName("fully qualified class name here").newInstance();
ここで私の疑問は、引数を取るコンストラクターがある場合、上記のようにインスタンス化する方法を教えてください。
おかげで、
ナレンドラ
Class.getConstructor()
を使用し、その上で Constructor.newInstance()
を呼び出します。たとえば、これがクラスFoo
のコンストラクタである場合:
public Foo(String bar, int baz) {
}
あなたはこのようなことをしなければならないでしょう:
Constructor c = Class.forName("Foo").getConstructor(String.class, Integer.TYPE);
Foo foo = (Foo) c.newInstance("example", 34);
コンストラクタに渡す必要のある引数を知る必要があります。それが望ましくない場合は、空のコンストラクターを用意することを検討してください。次に、コンストラクタに通常渡すものを設定するメソッドを用意します。
ここで正しいパターンがあるかどうか尋ねられるかもしれません。あなたは本当にリフレクションを使用する必要がありますか、おそらくより良いアプローチがありますか?オブジェクトに既にキャストしていることがわかっている場合は、通常の方法で作成しないでください。なぜこれを行う必要があるのかについて、より多くのコンテキストを提供したい場合があります。正当な理由はありますが、あなたは何も述べていません。
newInstance()
は常にデフォルトのコンストラクターを呼び出します。
パラメータ化されたコンストラクタを呼び出したい場合、
getDeclaredConstructor
メソッドに_Class[]
_を渡して、パラメータ型のコンストラクタを取得する必要がありますObject[]
_を渡してコンストラクタインスタンスを作成する必要がありますnewInstance()
コンストラクタのメソッドサンプルコードを見てください。
_import Java.lang.reflect.*;
class NewInstanceDemo{
public NewInstanceDemo(){
System.out.println("Default constructor");
}
public NewInstanceDemo(int a, long b){
System.out.println("Two parameter constructor : int,long => "+a+":"+b);
}
public NewInstanceDemo( int a, long b, String c){
System.out.println("Three parameter constructor : int,long,String => "+a+":"+b+":"+c);
}
public static void main(String args[]) throws Exception {
NewInstanceDemo object = (NewInstanceDemo)Class.forName("NewInstanceDemo").newInstance();
Constructor constructor1 = NewInstanceDemo.class.getDeclaredConstructor( new Class[] {int.class, long.class});
NewInstanceDemo object1 = (NewInstanceDemo)constructor1.newInstance(new Object[]{1,2});
}
}
_
出力:
_Java NewInstanceDemo
Default constructor
Two parameter constructor : int,long => 1:2
_
詳細については、Oracle ドキュメント ページを参照してください。
作成するオブジェクトのタイプをstring "fully qualified class name here"
に応じて選択する場合は、可能性が高いため、Strategy patternで置き換える必要があります。