检索 Ecore class 的包含

Retrieve containments of an Ecore class

我想检索 Ecore class 的容器。所以我有一个这样的结构:

class SuperClass{
    protected EObject superClassProperty;   
}

class SubClass extends SuperClass{
    private EObject subClassProperty;
}

现在我想获取子类(subClassProperty)的所有包含。 我这样做:

EList<EReference> _eAllContainments = eClass.getEAllContainments();

但是如果我这样做,我也会得到 superclasses (superClassProperty) 的继承包含。我怎样才能只检索给定 class(只是 subClassProperty)中包含的那些?

我认为您还没有像这样实例化超类:

    List<Superclass> list = new ArrayList<>();
    list.add(new Superclass());

所以没有子类的实例。您真的使用了正确的方法和正确的参数数量和类型吗?

子类是否有存储元素的字段?

以下 if 语句检查它们是来自子类还是超类:

eClass.getEAllContainments().get(i).EContainingClass.name == eClass.name

如果您指的是 ecore,我假设您使用的是 EObject 元素。 每个 EObject 实现 .eContents().eAllContents() 方法。

它们的区别是:

  • .eContents() 为您提供 List<EObject> 的 Class 的所有直接包含功能(元 class 中定义的所有功能,包含 = true) .
  • eAllContents() 给你一个 TreeIterator<EObject> 与树中的所有包含特性以你的 Class 作为根(基本上它 returns .eContents() 在所有直接 eContents() 包装到迭代器中)。

因此,如果您只想要直接包含的特征的值,那么只需使用 eClass.eContents()

因为我不完全清楚你想用什么来实现:

EList<EReference> = _eAllContainments = eClass.getEAllContainments();

我将向您展示一些使用 emf 获取所需对象的方法。

假设你有一个 Meta-Class 的实现对象(你应该知道实现和 meta-class 的区别,meta-Class 是 EClass 你正在建模并且实现是这个 EClass 的实现,但是 EClass 是一个完全独立的对象)然后你得到你的元 EClass通过调用 .eClass() 你的对象。

每个 EClass 都有关于其声明的 EReference 及其 EAttribute 的信息,您可以通过调用例如 .getE[All]References() 获得它们, .getAll... 也 returns 定义的 Super Classes 的所有元素 EClass.

现在您知道了如何获取您定义的元对象,但是您如何才能在您的实现对象中获取表示它们的实际值?

答案是“反思”。 EMF 使用所谓的反射 getter (.eGet) 和 setter (.eSet) ,它们采用 EStructuralFeature 和 return 的实际值它。

因为每个 EAttributeEReference 都是一个 EStructuralFeature,所以您可以从 EClass 信息返回到您的实施。

仅供参考:您还可以按名称获取 EClass 的 EStructuralFeatures,然后您可以这样做: 假设您的元素有一个名为 name 的属性,那么:

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

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