我想检索一个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并为其返回实际值。

由于每个EStructuralFeatureEAttribute都是一个EReference,因此您可以将连接从EStructuralFeature信息重新连接到实现。

仅供参考:您还可以按名称获取EClass的EStructuralFeatures,然后可以执行以下操作:
假设您的元素具有一个称为EClass的属性,则:

element.eGet(element.eClass().getEStructuralFeature("name"));


为您提供元素属性的实际值。

09-19 23:19