web-dev-qa-db-ja.com

リフレクションを使用して新しいオブジェクトを作成しますか?

与えられたクラス値:

_public class Value {

    private int xVal1;
    private int xVal2; 
    private double pVal;


    // constructor of the Value class 

    public Value(int _xVal1 ,int _xVal2 , double _pVal)
    {
        this.xVal1 = _xVal1;
        this.xVal2 = _xVal2;
        this.pVal = _pVal;
    }

    public int getX1val()
    {
        return this.xVal1;
    }


...
}
_

reflectionを使用して、そのクラスの新しいインスタンスを作成しようとしています:

メインから:

_    .... // some code 
    ....
    ....
    int _xval1 = Integer.parseInt(getCharacterDataFromElement(line));
    int _xval2 = Integer.parseInt(getCharacterDataFromElement(line2));
    double _pval = Double.parseDouble(getCharacterDataFromElement(line3));

     Class c = null;
     c = Class.forName("Value");
     Object o = c.newInstance(_xval1,_xval2,_pval);

...
_

これは機能しません、Eclipseの出力:The method newInstance() in the type Class is not applicable for the arguments (int, int, double)

もしそうなら、どのようにreflectionを使用して新しいValueオブジェクトを作成できますか?ここでConstructor of Valueを呼び出しますか?

ありがとう

19
JAN

このための正確なコンストラクタを見つける必要があります。 Class.newInstance()は、nullaryコンストラクターの呼び出しにのみ使用できます。だから書く

final Value v = Value.class.getConstructor(
   int.class, int.class, double.class).newInstance(_xval1,_xval2,_pval);
37
Marko Topolnik

Class.newInstance()メソッドは、引数なしのコンストラクターのみを呼び出すことができます。パラメーター化されたコンストラクターでリフレクションを使用してオブジェクトを作成する場合は、Constructor.newInstance()を使用する必要があります。あなたは単に書くことができます

Constructor<Value> constructor = Value.class.getConstructor(int.class, int.class, double.class);
Value obj = constructor.newInstance(_xval1,_xval2,_pval);

詳細については リフレクションを介したオブジェクトの作成Java例

1
Naresh Joshi