Вызов всех сеттеров в классе с помощью отражения

У меня есть объект домена, для целей этого вопроса я буду называть Person со следующими личными переменными:

<code>String name
int age
</code>

У каждого из них есть геттеры и сеттеры. Теперь у меня тоже естьMap<String, String> со следующими записями:

<code>name, phil
age, 35
</code>

Я хотел бы заполнить список всех методов сеттера в классе Person, а затем перебрать этот список и вызвать каждый метод, используя значения из карты.

Возможно ли это, так как я не вижу в сети примеров, близких к этому. Примеры очень ценятся.

Ответы на вопрос(4)

которое предварительно проверяет выходной класс и, следовательно, вызывает сеттеры для всех свойств, которые содержит карта. Он использует чистоjava.beans а такжеjava.lang.reflect.

public Object mapToObject(Map<String, Object> input, Class<?> outputType) {
    Object outputObject = null;
    List<PropertyDescriptor> outputPropertyDescriptors = null;
    // Test if class is instantiable with default constructor
    if(isInstantiable(outputType) 
            && hasDefaultConstructor(outputType)
            && (outputPropertyDescriptors = getPropertyDescriptors(outputType)) != null) {
        try {
            outputObject = outputType.getConstructor().newInstance();
            for(PropertyDescriptor pd : outputPropertyDescriptors) {
                Object value = input.get(pd.getName());
                if(value != null) {
                    pd.getWriteMethod().invoke(outputObject, value);
                }
            }
        } catch (InstantiationException|IllegalAccessException|InvocationTargetException|NoSuchMethodException e) {
            throw new IllegalStateException("Failed to instantiate verified class " + outputType, e);
        }
    } else {
        throw new IllegalArgumentException("Specified outputType class " + outputType + "cannot be instantiated with default constructor!");
    }
    return outputObject;
}

private List<PropertyDescriptor> getPropertyDescriptors(Class<?> outputType) {
    List<PropertyDescriptor> propertyDescriptors = null;
    try {
        propertyDescriptors = Arrays.asList(Introspector.getBeanInfo(outputType, Object.class).getPropertyDescriptors());
    } catch (IntrospectionException e) {
    }
    return propertyDescriptors;
}

private boolean isInstantiable(Class<?> clazz) {
    return ! clazz.isInterface() && ! Modifier.isAbstract(clazz.getModifiers());
}

private boolean hasDefaultConstructor(Class<?> clazz) {
    try {
        clazz.getConstructor();
        return true;
    } catch (NoSuchMethodException e) {
        return false;
    }
}
Решение Вопроса

это возможно! Вы можете получить все методы, которые начинаются с «set», выполнив это:

Class curClass = myclass.class;
Method[] allMethods = curClass.getMethods();
List<Method> setters = new ArrayList<Method>();
for(Method method : allMethods) {
    if(method.getName().startsWith("set")) {
        setters.add(method);
    }
}

Теперь у тебя есть методы. Вы уже знаете, как назвать их для своего экземпляра класса?

 ametren09 мая 2012 г., 02:02
Эй, нет проблем. У вас есть еще вопросы? Если нет, то можете ли вы отметить один из ответов как приняты
 user138316309 мая 2012 г., 00:34
Большое спасибо за помощь в этом
 Alan Feekery29 мар. 2016 г., 16:21
Вместо использования getMethods () используйте getDeclaredMethods (), если вы не хотите наследовать методы в своем списке.
 ivans31 янв. 2013 г., 10:34
@ Krrose27 - getMethods (), похоже, также возвращает унаследованные открытые методы из javadoc: "getMethods - возвращает массив, содержащий объекты Method, отражающие все открытые методы-члены класса или интерфейса, представленные этим объектом Class, включая методы, объявленные классом или интерфейс и те, которые унаследованы от суперклассов и суперинтерфейсов. "

Ты пыталсяBeanUtils.populate()) от Apache Commons BeanUtils?

BeanUtils.populate(yourObject, propertiesMap);

ты мог бы использовать библиотеку, Apache Commons BeanUtils. Если у вас есть карта, содержащая пары полей и значений, класс PropertyUtils могу помочь тебе

Person person = new Person();
for(Map.Entry<String, Object> entry : map.entrySet())
    PropertyUtils.setProperty(person, entry.getKey(), entry.getValue());

Ваш ответ на вопрос