web-dev-qa-db-ja.com

Class.forName()でクラスを初期化し、引数を取るコンストラクターがある

このようなクラスをインスタンス化しています。

myObj = (myObj) Class.forName("fully qualified class name here").newInstance();

ここで私の疑問は、引数を取るコンストラクターがある場合、上記のようにインスタンス化する方法を教えてください。

おかげで、
ナレンドラ

26
Narendra

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);

コンストラクタに渡す必要のある引数を知る必要があります。それが望ましくない場合は、空のコンストラクターを用意することを検討してください。次に、コンストラクタに通常渡すものを設定するメソッドを用意します。

ここで正しいパターンがあるかどうか尋ねられるかもしれません。あなたは本当にリフレクションを使用する必要がありますか、おそらくより良いアプローチがありますか?オブジェクトに既にキャストしていることがわかっている場合は、通常の方法で作成しないでください。なぜこれを行う必要があるのか​​について、より多くのコンテキストを提供したい場合があります。正当な理由はありますが、あなたは何も述べていません。

55
WhiteFang34

newInstance()は常にデフォルトのコンストラクターを呼び出します。

パラメータ化されたコンストラクタを呼び出したい場合、

  1. クラスのgetDeclaredConstructorメソッドに_Class[]_を渡して、パラメータ型のコンストラクタを取得する必要があります
  2. _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 ドキュメント ページを参照してください。

2
Ravindra babu

作成するオブジェクトのタイプをstring "fully qualified class name here"に応じて選択する場合は、可能性が高いため、Strategy patternで置き換える必要があります。

1
dantuch