使用反射指定对象字段值的Java方法
我想知道是否有可能在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
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;