我想检索Ecore类的包含。所以我有一个像这样的结构:
setShareHashTag()
现在我想获得SubClass(subClassProperty)的所有包含。 我是这样做的:
class SuperClass{
protected EObject superClassProperty;
}
class SubClass extends SuperClass{
private EObject subClassProperty;
}
但是,如果我这样做,我也会获得超类的继承包含(superClassProperty)。我怎样才能检索给定类中包含的那些(只是subClassProperty)?
答案 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
并返回其实际值。
由于每个EAttribute
和EReference
都是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