如果您指的是ecore,我假设您正在使用EObject
元素。EveryEObject
实现了.eContents()
和.eAllContents()
方法。
它们之间的区别是:
.eContents()
为您提供List<EObject>
调用它的类的所有直接包含特性(在包含 = true 的元类中定义的所有特性)。
eAllContents()
为您TreeIterator<EObject>
提供以您的类为根的树中的所有包含功能(基本上它返回.eContents()
所有直接eContents()
包装到迭代器中的内容)。
因此,如果您只想要直接包含的特征的值,那么只需使用eClass.eContents()
.
因为我并不完全清楚您要达到的目标:
EList<EReference>
= _eAllContainments = eClass.getEAllContainments();
我将向您展示一些使用 emf 获取所需对象的方法。
假设您有一个元类的实现对象(您应该知道实现和元类之间的区别,元类是EClass
您正在建模的,而实现是,以及 this 的实现EClass
,但 EClass 是一个完全独立的对象)然后你通过调用它来获得你的对象的元 EClass .eClass()
。
每个EClass
都有关于它的声明EReference
和它的信息EAttribute
,你可以通过调用 eg: 来获得它们.getE[All]References()
,.getAll...
它还返回你的定义的超类的所有元素EClass
。
所以现在您知道如何获取您定义的元对象,但是如何在您的实现对象中获取表示它们的实际值呢?
答案是“反思”。EMF 使用所谓的反射 getter ( .eGet
) 和 setter ( .eSet
) ,它们接受一个EStructuralFeature
并返回它的实际值。
因为每一个你EAttribute
都可以从你的信息中获得连接到你的实现。EReference
EStructuralFeature
EClass
仅供参考:您还可以通过名称获取 EClass 的 EStructuralFeatures,然后您可以执行以下操作:假设您的元素有一个 Attribute ,name
然后调用它:
element.eGet(element.eClass().getEStructuralFeature("name"));
为您提供元素属性的实际值。