我想检索一个Ecore类的容器。所以我有一个像这样的结构:
class SuperClass{
protected EObject superClassProperty;
}
class SubClass extends SuperClass{
private EObject subClassProperty;
}
现在,我想获取子类(subClassProperty)的所有包含。
我这样做是这样的:
EList<EReference> _eAllContainments = eClass.getEAllContainments();
但是,如果这样做,我还将获得超类的继承包含(superClassProperty)。我如何才能检索给定类(只是subClassProperty)中包含的那些?
最佳答案
如果您指的是ecore,则假定您正在使用EObject
元素。
每个EObject
都实现.eContents()
和.eAllContents()
方法。
它们之间的区别是:.eContents()
为您提供了一个List<EObject>
,其中包含它所调用的类的所有直接包含功能(在包含containment = true的元类中定义的所有功能)。
虽然eAllContents()
在树中以类为根,为您提供了所有包含功能的TreeIterator<EObject>
(基本上,它包装在迭代器中的所有直接.eContents()
上都返回eContents()
)
因此,如果您只想要直接包含的要素的值,则只需使用eClass.eContents()
因为我尚不完全清楚您要达到的目标:
EList<EReference>
= _eAllContainments = eClass.getEAllContainments();
我将向您展示一些使用emf来获取所需对象的方法。
假设您具有元类的实现对象(您应该知道实现和元类之间的区别,元类是您要建模的EClass
,而实现是,是,但EClass是一个完全独立的对象),则可以通过在其上调用EClass
来获取该对象的meta-EClass。
每个.eClass()
都具有有关其声明的EClass
及其EReference
的信息,您可以通过调用例如EAttribute
来获取它们,.getE[All]References()
还返回.getAll...
的已定义超类的所有元素。
因此,现在您知道如何获取定义的元对象,但是如何获取实现对象中代表它们的实际值呢?
答案是“反射”。 EMF使用所谓的反射式吸气剂(EClass
)和设置器(.eGet
),它们采用.eSet
并为其返回实际值。
由于每个EStructuralFeature
和EAttribute
都是一个EReference
,因此您可以将连接从EStructuralFeature
信息重新连接到实现。
仅供参考:您还可以按名称获取EClass的EStructuralFeatures,然后可以执行以下操作:
假设您的元素具有一个称为EClass
的属性,则:
element.eGet(element.eClass().getEStructuralFeature("name"));
为您提供元素属性的实际值。