java - 为 hashMap 中的每个键调用 setter

标签 java refactoring

我有一个如下的 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/

相关文章:

java - Guava 可选择使用多个对象和字段

java - AWS SDK - AmazonS3ClientBuilder 实例是否过期?

java - 为什么java应用程序占用大量内存?

java - 谷歌日历 v3 Java API : Insert event

c# - DI 构造函数的模板化重构

vba - MS Access - 模块化/解耦表单以进行重构的最佳方式

c# - 重构 “procedural” WCF服务

java.nio transferTo 似乎快得不可思议?

Python:在构建器外部实例化类时抛出警告

objective-c - 在 XCode 4.3.2 中,当我运行 ARC 转换重构工具时,我所有的 "retain"属性选项都没有更改为 "strong"