我想设置对象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;
}
最佳答案
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
类也有有用的方法。