我有一个如下的 hashMap
Map<String, Object> attributes = new HashMap<String, Object> {
{
put("type", "A");
put("duration", 10);
put("isSet", true);
}
}
现在我想用这些值填充一个对象。如何在 for 循环中调用 setter,而不是手动调用每个方法。 假设我想用这些属性填充对象 ob。
最佳答案
您可以简单地使用 java beans 标准:
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 。仅当您已经拥有包含来自其他地方的此类条目的 map 时,它才会很方便。
另请注意,此实现与条目 isSet=true
不兼容。它需要一个名为 set
的输入键。
您可能真的想看看构建器模式。如果使用 java 8,您可能对实现构建器模式的更通用方法感兴趣,如 this answer of me 中所示。 .
关于java - 为 hashMap 中的每个键调用 setter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39489758/