Установить значение, зная EObject и его EAttribute

Я хочу установить стоимость объекта EObject зная, что это EAttribute, Это возможно?

Я могу использовать отражения, построить имя метода и вызвать его, но есть ли лучший способ добиться этого? Может быть, уроки EMF Util?

public static Object invokeMethodBy(EObject object, EAttribute attribute, Object...inputParameters){
    String attrName = attribute.getName().substring(0, 1).toUpperCase() + attribute.getName().substring(1);
    Object returnValue = null;
    try {
        returnValue = object.getClass().getMethod("set"+attrName, boolean.class).invoke(object,inputParameters);
    } catch (IllegalAccessException | IllegalArgumentException
            | InvocationTargetException | NoSuchMethodException
            | SecurityException e1) {
        e1.printStackTrace();
    }
    return returnValue;
}

1 ответ

Решение

EMF уже имеет свои собственные механизмы самоанализа, которые не используют Java Reflection, но используют статический сгенерированный код.

Что вам нужно, это:

object.eSet(attribute, value);

Если атрибут представляет собой отношение "многие", например List, вам нужно получить список до, а затем добавить содержимое в список:

if (attribute.isMany()) {
    List<Object> list = (List<Object>) object.eGet(attribute);
    list.addAll(value);
}

Если у вас нет EAttribute но есть имя атрибута (как String) вы также можете получить EStructuralFeature по имени, используя EClass метаданные:

EStructuralFeature feature = object.eClass.getEStructuralFeature(attributeName);
object.eSet(feature, value);

Вам следует обратиться к EObject API, в частности к методам, начинающимся с "e". EcoreUtil Класс также имеет полезные методы.

Другие вопросы по тегам