前面基本都讲解过了,所以只是简单说明说明。
属性EAttribute,都有类型,即通过eAttributeType来描述,类型是EDataType。
eAttributes 是一个Eclass的所有的属性的集合(EList),但不包含超类的属性
eAllAttributes 是所有的属性的集合(EList),即包含Eclass自己的属性,也包含超类的属性。
eIDAttribute 是指在eAllAttribute里的第一个EAttribute。
对应的方法如下
EList getEAttributes()
EList getEAllAttributes()
EAttribute getEIDAttribute()
跟Class关系都能对上。
具体的代码都在getEAllAttributes()这个方法里呢。
如下:
说明:result 是用来放超类和类本身的属性的。
首先通过getESuperTypes()取得超类,然后依次调用所有超类的getEAllAttributes()。
这是个迭代过程。
attributes 是用来放类本身的属性的。通过getEStructuralFeatures()取得类本身所有的EAttribute和EReference。再判断,如果是EAttribute,就把它放到attributes 里。
以上代码还是比较简单的。
- public EList<EAttribute> getEAllAttributes() {
- if (eAllAttributes == null) {
- eIDAttribute = null;
- BasicEList<EAttribute> result = new UniqueEList<EAttribute>() {
- private static final long serialVersionUID = 1L;
- @Override
- protected Object [] newData(int capacity) {
- return new EAttribute [capacity];
- }
- @Override
- protected boolean useEquals() {
- return false;
- }
- @Override
- protected void didAdd(int index, EAttribute eAttribute) {
- if (eAttribute.isID() && eIDAttribute == null) {
- eIDAttribute = eAttribute;
- }
- }
- };
- BasicEList<EAttribute> attributes = new UniqueEList<EAttribute>() {
- private static final long serialVersionUID = 1L;
- @Override
- protected Object [] newData(int capacity) {
- return new EAttribute [capacity];
- }
- @Override
- protected boolean useEquals() {
- return false;
- }
- };
- Set<EClass> computationInProgress = COMPUTATION_IN_PROGRESS.get();
- if (computationInProgress.add(this)) {
- for (EClass eSuperType : getESuperTypes()) {
- result.addAll(eSuperType.getEAllAttributes());
- }
- computationInProgress.remove(this);
- }
- for (EStructuralFeature eStructuralFeature : getEStructuralFeatures()) {
- if (eStructuralFeature instanceof EAttribute) {
- attributes.add((EAttribute)eStructuralFeature);
- }
- }
- attributes.shrink();
- eAttributes = new EcoreEList.UnmodifiableEList.FastCompare<EAttribute>
- (this, EcorePackage.eINSTANCE.getEClass_EAttributes(), attributes.size(), attributes.data()) {
- private static final long serialVersionUID = 1L;
- @Override
- public void addUnique(EAttribute object) {
- ((InternalEList<EAttribute>)(InternalEList<?>)getEStructuralFeatures()).addUnique(object);
- }
- @Override
- public boolean add(EAttribute object) {
- System.err.println("Please fix your code to add using EClass.getEStructuralFeatures() instead of EClass.getEAttributes()");
- return getEStructuralFeatures().add(object);
- }
- };
- result.addAll(eAttributes);
- result.shrink();
- eAllAttributes = new EcoreEList.UnmodifiableEList.FastCompare<EAttribute>
- (this, EcorePackage.eINSTANCE.getEClass_EAllAttributes(), result.size(), result.data());
- getESuperAdapter().setAllAttributesCollectionModified(false);
- }
- return eAllAttributes;
- }
在EAttribute类里取得eAttributeType的方法是:
EDataType getEAttributeType()