web-dev-qa-db-fra.com

Créer un nouvel objet en utilisant la réflexion?

Valeur de classe donnée:

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


...
}

J'essaie de créer une nouvelle instance de cette classe en utilisant reflection:

de Main:

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

...

Cela ne fonctionne pas, sortie d'Eclipse: The method newInstance() in the type Class is not applicable for the arguments (int, int, double)

Si oui, comment puis-je créer un nouvel objet Value en utilisant reflection, où j'invoque le Constructor de Value?

Merci

19
JAN

Vous devez localiser le constructeur exact pour cela. Class.newInstance() ne peut être utilisé que pour appeler le constructeur nullary. Alors écris

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

La méthode Class.newInstance() ne peut invoquer qu'un constructeur sans argument. Si vous souhaitez créer des objets en utilisant la réflexion avec un constructeur paramétré, vous devez utiliser Constructor.newInstance(). Vous pouvez simplement écrire

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

Pour plus de détails, vous pouvez lire Création d'objets via Reflection dans Java avec exemple

1
Naresh Joshi