2012-05-06 33 views
14

danej klasy Wartość:Utwórz nowy obiekt za pomocą odbicia?

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


... 
} 

Próbuję utworzyć nową instancję tej klasy przy użyciu reflection:

od głównego:

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

... 

ten nie działa, wyjście Eclipse : The method newInstance() in the type Class is not applicable for the arguments (int, int, double)

Jeśli tak, w jaki sposób mogę utworzyć nowy obiekt wartości za pomocą reflection, wh Czy mogę wywołać Constructor z Value?

Dzięki

Odpowiedz

34

Musisz zlokalizować dokładne konstruktora do tego. Class.newInstance() może być użyty tylko do wywołania konstruktora nullary. Więc napisać

final Value v = Value.class.getConstructor(
    int.class, int.class, double.class).newInstance(_xval1,_xval2,_pval); 
+0

Dzięki, działa świetnie! myślę jednak, jak teraz użyć obiektu Object? ponieważ jest to obiekt "Wartość", ale jest również obiektem Object. Więc po prostu użyj castingu, np. "Value currentValueNode = (Value) myObject;" ? – ron

+0

Zobacz edytowaną odpowiedź. Kiedy zaczynasz od literału klasy zamiast 'Class.forName()', możesz wykorzystać generyczne. –

+0

Marko, twoja nowa poprawka działa tylko bez "ostatecznego". dzięki ! – ron

1

Sposób Class.newInstance() może jedynie powołać konstruktor nie-Arg. Jeśli chcesz utworzyć obiekty za pomocą odbicia z parametryzowanym konstruktorem, musisz użyć Constructor.newInstance(). można po prostu napisać

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

Szczegółowe informacje można przeczytać Creating objects through Reflection in Java with Example

Powiązane problemy