2016-09-14 3 views
0

У меня есть HashMap, как показано нижеInvoke сеттеры для каждого из ключей, присутствующих в HashMap

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

Теперь я хотел бы, чтобы заполнить объект с этими значениями. Как я могу вызвать сеттеры в цикле for вместо ручного вызова каждого метода. Скажем, я хочу заполнить объект ob этими свойствами.

+1

Пожалуйста, не делайте этого, если вам действительно не нужно. Вместо этого вы должны правильно называть методы set. – marstran

+0

Согласен, вы не должны этого делать, если хотите, чтобы избежать большого количества кода, попробуйте Builder Pattern. – Shadov

ответ

2

Вы можете просто использовать стандартный 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())); 
     } 
    } 
} 

Обратите внимание, что это не должно вообще быть использованы, чтобы избежать вызова сеттеров. Это удобно, если у вас уже есть карта, содержащая такие записи из другого места.

Также обратите внимание, что эта реализация несовместима с входом isSet=true. Для этого потребуется ключ ввода set.

Возможно, вы действительно захотите посмотреть на шаблон строителя. Если вы используете java 8, вам может быть интересен более общий способ реализации шаблона построителя, как показано в this answer of me.

 Смежные вопросы

  • Нет связанных вопросов^_^