为hashMap中存在的每个键调用setter

时间:2016-09-14 11:51:59

标签: java refactoring

我有一个hashMap,如下所示

Map<String, Object> attributes = new HashMap<String, Object> {
    {
        put("type", "A");
        put("duration", 10);
        put("isSet", true);
    }
}

现在我想用这些值填充对象。如何在for循环中调用setter而不是手动调用每个方法。 假设我想用这些属性填充对象ob。

1 个答案:

答案 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所示。