2011-09-22 38 views
8

tôi đã tự hỏi liệu nó sẽ có thể có một cái gì đó như sau trong Java:phương pháp Java để gán giá trị lĩnh vực đối tượng với Reflection

public class MyClass { 
    private String name; 
    private Integer age; 
    private Date dateOfBirth; 
    // constructors, getters, setters 

    public void setField(String aFieldName, Object aValue) { 
     Field aField = getClass().getDeclaredField(aFieldName); 
     // use: aField.set(...) with proper type handling 
    } 
} 

Tôi thực sự bị mắc kẹt trong phương pháp setField và bất kỳ ý tưởng sẽ rất Hữu ích.

Cảm ơn!

EDIT: Lý do cho điều này là tôi muốn có một phương pháp trong lớp khác như sau

public static MyClass setAll(List<String> fieldNames, List<Object> fieldValues) { 
    MyClass anObject = new MyClass(); 
    // iterate fieldNames and fieldValues and set for each fieldName 
    // the corresponding field value 
    return anObject; 
} 

Trả lời

7

chắc:

aField.set(this, aValue); 

Để làm loại kiểm tra đầu tiên:

if (!aField.getType().isInstance(aValue)) 
    throw new IllegalArgumentException(); 

nhưng kể từ khi gọi set với giá trị sai loại sẽ tạo ra IllegalArgumentException anyway, đó là loại kiểm tra không phải là rất hữu ích.

+1

Có, tôi đã thử điều này nhưng tôi muốn thêm một số loại kiểm tra kiểu và truyền thích hợp trong phương thức. Bất kỳ ý tưởng? – gpol

+0

Bạn có thể làm loại kiểm tra nếu bạn muốn (nhưng nếu tất cả các bạn làm với một kiểm tra thất bại là để ném, sau đó đó là vô nghĩa, kể từ khi cơ chế phản ánh sẽ ném cho bạn). Không đúc sẽ phù hợp. –

4

Mặc dù tôi đang ở một mất mát như lý do tại sao bạn sẽ muốn làm điều đó như thế (vì bạn đã có getter và setter), hãy thử này:

Field aField = getClass().getDeclaredField(aFieldName); 
aField.set(this, aValue); 

Mọi chi tiết, see this.

+0

Ngớ ngẩn của tôi. Tôi đã chỉnh sửa câu hỏi của mình để giải thích tại sao tôi lại muốn. – gpol

+0

OK, câu trả lời có đủ tốt không? Nếu bạn muốn, bạn cũng có các phiên bản chuyên biệt hơn của 'set', chẳng hạn như' setLong', 'setFloat',' setBoolean' vv Xem tham chiếu Javadoc. –

3

Tôi muốn đề xuất một số map thay vì List<T>.

for(Map.Entry<String,Object> entry:map.entrySet()) 
    { 
    Field aField = anObject.getClass().getDeclaredField(entry.getKey()); 
    if(entry.getValue().getClass().equals(aField.getType())) 
     aField.set(anObject,entry.getValue()); 
    } 
return anObject; 
Các vấn đề liên quan