2012-05-06 46 views
14

Với lớp Value:Tạo đối tượng mới bằng cách sử dụng sự phản chiếu?

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


... 
} 

Tôi đang cố gắng để tạo ra một thể hiện mới của lớp đó sử dụng reflection:

từ chính:

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

... 

này không hoạt động, sản lượng của Eclipse : The method newInstance() in the type Class is not applicable for the arguments (int, int, double)

Nếu có, làm cách nào để tạo đối tượng Giá trị mới bằng cách sử dụng reflection, wh Tôi có gọi số Constructor của Value không?

Cảm ơn

Trả lời

34

Bạn cần xác định chính xác hàm tạo này. Class.newInstance() chỉ có thể được sử dụng để gọi hàm tạo null. Vì vậy, viết

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

Cảm ơn, hoạt động tuyệt vời! một suy nghĩ mặc dù, làm thế nào để tôi sử dụng đối tượng Object bây giờ? vì nó là một đối tượng "Value", nhưng nó cũng là một đối tượng Object. Vì vậy, chỉ cần sử dụng tính năng truyền, như "Giá trị hiện tạiValueNode = (Giá trị) myObject;" ? – ron

+0

Xem câu trả lời đã chỉnh sửa. Khi bạn bắt đầu với class literal thay vì 'Class.forName()', bạn có thể tận dụng Generics. –

+0

Marko, bản sửa lỗi mới của bạn chỉ hoạt động mà không có "cuối cùng". cảm ơn ! – ron

1

Phương thức Class.newInstance() chỉ có thể gọi một hàm tạo không có arg. Nếu bạn muốn tạo các đối tượng sử dụng sự phản chiếu với hàm tạo tham số hơn là bạn cần sử dụng Constructor.newInstance(). Bạn chỉ có thể viết

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

Để biết chi tiết bạn có thể đọc Creating objects through Reflection in Java with Example

Các vấn đề liên quan