使用Reflection分配对象字段值的Java方法

时间:2011-09-22 06:28:53

标签: java reflection

我想知道是否有可能在Java中使用以下内容:

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

我真的陷入了setField方法,任何想法都会非常有用。

谢谢!

编辑:原因是我想在另一个类中使用一个方法,如下面的

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

3 个答案:

答案 0 :(得分:7)

不确定

aField.set(this, aValue);

首先进行类型检查:

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

但是,因为使用错误类型的值调用set无论如何都会生成IllegalArgumentException,这种检查不是很有用。

答案 1 :(得分:4)

虽然我不知道为什么你会这样做(因为你已经有吸气剂和制定者),试试这个:

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

有关详细信息,请see this

答案 2 :(得分:3)

我想建议使用map代替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;