前面基本都讲解过了,所以只是简单说明说明。
一个EReference通过eReferenceType来描述类型,它的类型是一个EClass。而他的超类ETypedElement通过eType来指定类型。
所以eType这时可以向下转换为Eclass。
eReferences 是一个Eclass的所有包含类的关系的集合(EList),但不包含超类的。
eAllReferences是所有的包含类的关系的集合(EList),即包含Eclass自己的,也包含超类的。
eContainments是聚合关系中,所有的被聚合的关系的集合。所谓聚合就是被包含的类的生命周期是跟随聚合对象的。
eOpposite, 是在双向关联中,本EClass在对方中的包含关系。双向的当然需要两个EReference来描述了。
eOpposite是指对方的,很容易理解的。
而属性里containment是指是否被聚合了,而container正好是说一个类是否聚合了其他的类了。
而ResolveProxies属性则指这个EReference是否被代理了。是跟序列化和反序列化相关的。
在EClass里对应的方法如下
EList getEReferences()
EList getEAllReferences()
EList getEAllContainments()
跟TMD getEALLAttributes()是一样的。ctrl+C 和ctrl+V简单完成的代码。
- public EList<EReference> getEAllReferences() {
- if (eAllReferences == null) {
- class ReferenceList extends UniqueEList<EReference> {
- private static final long serialVersionUID = 1L;
- public ReferenceList() {
- super();
- }
- @Override
- protected Object [] newData(int capacity) {
- return new EReference [capacity];
- }
- @Override
- protected boolean useEquals() {
- return false;
- }
- }
- BasicEList<EReference> result = new ReferenceList();
- BasicEList<EReference> references = new ReferenceList();
- Set<EClass> computationInProgress = COMPUTATION_IN_PROGRESS.get();
- if (computationInProgress.add(this)) {
- for (EClass eSuperType : getESuperTypes()) {
- result.addAll(eSuperType.getEAllReferences());
- }
- computationInProgress.remove(this);
- }
- for (EStructuralFeature eStructuralFeature : getEStructuralFeatures()) {
- if (eStructuralFeature instanceof EReference) {
- references.add((EReference)eStructuralFeature);
- }
- }
- references.shrink();
- eReferences = new EcoreEList.UnmodifiableEList.FastCompare<EReference>
- (this, EcorePackage.eINSTANCE.getEClass_EReferences(), references.size(), references.data()) {
- private static final long serialVersionUID = 1L;
- @SuppressWarnings("unchecked")
- @Override
- public void addUnique(EReference object) {
- ((InternalEList<EReference>)(InternalEList<?>)getEStructuralFeatures()).addUnique(object);
- }
- @Override
- public boolean add(EReference object) {
- System.err.println("Please fix your code to add using EClass.getEStructuralFeatures() instead of EClass.getEReferences()");
- return getEStructuralFeatures().add(object);
- }
- };
- result.addAll(eReferences);
- result.shrink();
- eAllReferences = new EcoreEList.UnmodifiableEList.FastCompare<EReference>
- (this, EcorePackage.eINSTANCE.getEClass_EAllReferences(), result.size(), result.data());
- getESuperAdapter().setAllReferencesCollectionModified(false);
- }
- return eAllReferences;
- }
在EReference类里取得eOpposite的方法是:
EReference getEOpposite()
取得eReferenceType的方法是:
EClass getEReferenceType()