检索Ecore类的包含

时间:2016-09-06 10:14:07

标签: java oop ecore

我想检索Ecore类的包含。所以我有一个像这样的结构:

setShareHashTag()

现在我想获得SubClass(s​​ubClassProperty)的所有包含。 我是这样做的:

class SuperClass{
    protected EObject superClassProperty;   
}

class SubClass extends SuperClass{
    private EObject subClassProperty;
}

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

3 个答案:

答案 0 :(得分:1)

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

它们之间的区别是:

.eContents()为您提供了一个List<EObject>,其中包含所调用的类的所有直接包含功能(元类中定义的所有功能,包含contains = true)。 虽然eAllContents()为您提供了一个TreeIterator<EObject>,其中包含一个以树为根的所有包含功能(基本上它会在包含在迭代器中的所有直接.eContents()上返回eContents()

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

因为我并不完全清楚你想要实现的目标:

  

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

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

假设你有一个元类的实现对象(你应该知道实现和元类之间的区别,元类是你建模的EClass,实现是,是的实现这个EClass,但EClass是一个完全独立的对象,然后通过调用它上面的.eClass()得到你的对象的meta-EClass。

每个EClass都有关于其声明的EReference及其EAttribute的信息,您可以通过调用例如:.getE[All]References()来获取它们,.getAll...也会返回所有元素已定义的EClass超级类。

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

答案是“反思”。 EMF使用所谓的反射吸气剂(.eGet)和设定器(.eSet),它采用EStructuralFeature并返回其实际值。

由于每个EAttributeEReference都是EStructuralFeature,因此您可以从EClass信息中恢复与实施的连接。

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

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

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

答案 1 :(得分:0)

我认为你没有实现超类,如:

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

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

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

答案 2 :(得分:0)

以下if语句检查这些语句是来自sub还是超类:

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