2012-05-06 15 views
14

Teniendo en cuenta la clase de valor:¿Crear nuevo objeto usando la reflexión?

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


... 
} 

estoy tratando de crear una nueva instancia de esa clase usando reflection:

del principal:

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

... 

Esto no funciona, la producción de Eclipse : The method newInstance() in the type Class is not applicable for the arguments (int, int, double)

En caso afirmativo, ¿cómo puedo crear un nuevo objeto Value utilizando reflection, wh Antes de invocar el Constructor de Value?

Gracias

Respuesta

34

Necesitas ubicar el constructor exacto para esto. Class.newInstance() solo se puede usar para llamar al constructor nullary. Así que escribir

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

Gracias, funciona muy bien! uno piensa, ¿cómo uso el objeto Object ahora? ya que es un objeto "Valor", pero también es un objeto Objeto. Así que solo use casting, como "Value currentValueNode = (Value) myObject;" ? – ron

+0

Ver respuesta editada. Cuando comienzas con el literal de clase en lugar de 'Class.forName()', puedes aprovechar los genéricos. –

+0

Marko, tu nueva solución funciona solo sin el "final". Gracias ! – ron

1

El método Class.newInstance() sólo puede invocar a un constructor sin argumentos. Si desea crear objetos utilizando la reflexión con el constructor parametrizado de lo que necesita para usar Constructor.newInstance(). Simplemente hay que escribir

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

Para más detalles se puede leer Creating objects through Reflection in Java with Example

Cuestiones relacionadas