2012-05-06 7 views
14

Verilen sınıf Değeri:Yansıma kullanarak yeni nesne oluşturulsun mu?

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


... 
} 

Ben reflection kullanarak bu sınıfın yeni bir örneğini oluşturmak çalışıyorum: 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); 

... 

Bu işe yaramazsa, Eclipse'nın çıkışını : The method newInstance() in the type Class is not applicable for the arguments (int, int, double)

Öyleyse, reflection, wh kullanarak yeni bir Değer nesnesini nasıl oluşturabilirim? 12 Constructor'un Value'unu çağırıyorum?

Teşekkürler

cevap

34

Bunun için tam yapıcıyı bulmanız gerekir. Class.newInstance() sadece nullary kurucuyu çağırmak için kullanılabilir. Yani

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

Teşekkür okuyabilir ayrıntılar için

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

yazabilir, inşaat büyük! Bir düşünün, şimdi Object nesnesini nasıl kullanırım? bir "Değer" nesnesi olduğu için, aynı zamanda bir Nesne nesnesidir. Bu nedenle, "Value currentValueNode = (Value) myObject; gibi") ? – ron

+0

Düzenlenmiş cevaba bakınız. Class.forName() 'yerine sınıf değişkeni ile başladığınızda, jeneriklerden yararlanabilirsiniz. –

+0

Marko, yeni düzeltmeniz sadece "son" olmadan çalışır. Teşekkürler ! – ron

1

Class.newInstance() yöntem yalnızca bir no-arg yapıcı çağırabilirsiniz yazın. Parametreleştirilmiş kurucu ile yansıma kullanarak nesne oluşturmak istiyorsanız, Constructor.newInstance()'u kullanmanız gerekir. Sadece sen Creating objects through Reflection in Java with Example