使用反射指定对象字段值的Java方法

使用反射指定对象字段值的Java方法,java,reflection,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 = g

我想知道是否有可能在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
    }
 }
我真的被设置场的方法卡住了,任何想法都会很有帮助

谢谢

编辑:这样做的原因是我希望在另一个类中有一个方法,如下所示

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;
}
publicstaticmyclass setAll(列出字段名,列出字段值){
MyClass anObject=新的MyClass();
//迭代字段名和字段值,并为每个字段名设置
//对应的字段值
返回一个对象;
}
当然可以:

aField.set(this, aValue);
要首先执行类型检查,请执行以下操作:

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

但是,由于使用错误类型的值调用
set
将生成
IllegalArgumentException
,这种检查并不是很有用。

尽管我不知道为什么要这样做(因为您已经有了getter和setter),请尝试以下方法:

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

有关更多信息,.

我想建议使用
地图,而不是
列表

for(Map.Entry:Map.entrySet())
{
Field aField=anObject.getClass().getDeclaredField(entry.getKey());
if(entry.getValue().getClass().equals(aField.getType()))
set(一个对象,entry.getValue());
}
返回一个对象;

是的,我尝试过,但问题是我想在方法中添加一些类型检查和适当的转换。有什么想法吗?如果你想的话,你可以做类型检查(但是如果你对失败的检查所做的只是抛出,那么这是毫无意义的,因为反射机制会为你抛出)。没有合适的演员。我真傻。我编辑我的问题是为了解释我为什么想要它。好吧,那么答案足够好吗?如果您愿意,还可以使用更专业的
set
版本,如
setLong
setFloat
setBoolean
等。请参阅参考的Javadoc。
 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;