检索 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 的实际值它。
因为每个 EAttribute
和 EReference
都是一个 EStructuralFeature
,所以您可以从 EClass
信息返回到您的实施。
仅供参考:您还可以按名称获取 EClass 的 EStructuralFeatures,然后您可以这样做:
假设您的元素有一个名为 name
的属性,那么:
element.eGet(element.eClass().getEStructuralFeature("name"));
为您提供元素属性的实际值。
我想检索 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 的实际值它。
因为每个 EAttribute
和 EReference
都是一个 EStructuralFeature
,所以您可以从 EClass
信息返回到您的实施。
仅供参考:您还可以按名称获取 EClass 的 EStructuralFeatures,然后您可以这样做:
假设您的元素有一个名为 name
的属性,那么:
element.eGet(element.eClass().getEStructuralFeature("name"));
为您提供元素属性的实际值。