基于反射机制的EMF模型比较 - 编程入门网
以使用反射 API 来存取它的数据。
图 2. EObject 接口 图 2 所示为 EObject 接口,其中 EMF 提供的反射方法有 eGet(),eSet() ,eUnset() 和 eIsSet(),由于 EObject 接口是所有 EMF 建模类型必须实现的 接口,所以所有 EMF 对象都可以使用反射 API 方法,这是本文阐述的实现比较 EMF 对象解决方案的基石。对这五个反射方法的解释如下: Object eGet(EStructuralFeature)方法将返回 EStructuralFeature 表示属 性的值,等同于调用 Object eGet(EStructuralFeature,true) 方法。 Object eGet(EStructuralFeature,boolean)方法的 boolean 参数用来指定 是否在返回之前解析并加载代理(Proxies)的引用对象。关于 EMF 的代理 (Proxy) 请参阅参考文档扩展阅读。 eSet(EStructuralFeature,Object)方法将参数中的 Object 对象设置为指定 属性的新值。 eIsSet(EStructuralFeature)方法返回一个布尔值表示一个属性是否已经被 设置值。 eUnSet(EStructuralFeature)方法可以用来重置或取消一个属性的值。 用 EMF 反射实现对象按字段值比较 本章阐述如何得到 EStructuralFeature 对象,并通过 EMF 对象的反射方法 读取字段的值。对于取得的值,区别其是简单类型还是组合类型,之后分别进行 比较。 运用反射 API 读取对象的字段值 本文用 EObject 对象的 eGet(EStructuralFeature) 方法读取 EObject 对 象的值。首先,需要得到该方法的参数 EstructuralFeature。EMF 将模型类型 的字段相关描述信息集中放置到实现 EPackage 接口的类内部。EMF 代码生成工 具会为建模模型生成 EPackage 的子接口,由这个接口的静态变量 eINSTANCE 得到它的实例,将其作为 eGet 方法的参数即可得到相应的值。代码如清单 1 所示: 清单 1. 使用反射 API 的代码与非反射代码的示例
由清单 1 可见,如不使用反射 API 读取对象的值,首先需要将对象转型。 当需要取值的类型很多时,转型语句会随之增多,大大增加代码书写和维护的工 作量。尤其是这种取值方法必须已知被取值对象的类型,相对于使用反射 API 进行取值,这种方法是僵硬,且难于复用的。 基于反射机制的EMF模型比较(3)时间:2011-09-09 IBM 石立川 王芹华 邵兵判断简单数据类型或组合数据类型 因为要实现按值比较,所以首先要区别得到的字段值是简单数据类型还是组 合数据类型。 图 3. Eclass, EAttribute, EReference, EDataType 关系图 图 3 描述了 EClass, EAttribute, EReference 和 EDataType 的关系,可 知 EReference 类型的 eReferenceType 总是一个 EClass 的组合类型, EAttribute 的类型则总是一个简单类型。这有利于了解区分简单类型和组合类 型的方法,也便于理解 EMF 对建模模型的描述,从而更好的运用 EMF 反射 API 。于是,本文使用清单 2 代码所示的方法区分类型是简单还是组合,如下: 清单 2. 判断简单数据类型或组合数据类型
清单 2 代码通过 inst |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |