我有一个hashMap,如下所示
Map<String, Object> attributes = new HashMap<String, Object> {
{
put("type", "A");
put("duration", 10);
put("isSet", true);
}
}
现在我想用这些值填充对象。如何在for循环中调用setter而不是手动调用每个方法。 假设我想用这些属性填充对象ob。
答案 0 :(得分:2)
您可以简单地使用java bean标准:
import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
public void populateValues(Object bean, Map<String, Object> propertyValues) throws IntrospectionException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
BeanInfo beanInfo = Introspector.getBeanInfo(Pojo.class);
for(PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) {
if(pd.getWriteMethod() != null && propertyValues.containsKey(pd.getName())) {
pd.getWriteMethod().invoke(bean, propertyValues.get(pd.getName()));
}
}
}
请注意,这通常不应用于避免调用setter。如果您已经有一个包含来自其他地方的此类条目的地图,那么它只是方便。
另请注意,此实现与条目isSet=true
不兼容。它需要一个名为set
的输入键。
您可能真的想要查看构建器模式。如果使用java 8,您可能会对实现构建器模式的更一般方法感兴趣,如this answer of me所示。