快速业务通道

基于反射机制的EMF模型比较 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
以使用反射 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 的代码与非反射代码的示例

EStructuralFeature feature  =ModelPackage.eINSTANCE.getNodeElement_Description();   Object remoteValue = remote.eGet(feature);   Object localValue = local.eGet(feature); 不使用反射的代码:   Object removeValue = ((NodeElement)remote).getDescription ();   Object localValue = ((NodeElement)local).getDescription ();

由清单 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. 判断简单数据类型或组合数据类型

if (remote.eGet(feature) instanceof EList|| local.eGet (feature) instanceof EList) {      // 集合数据类型,需要遍历其中每一个元素进行比较   }   else if(remote.eGet(feature) instanceof EObject||local.eGet (feature) instanceof EObject)   {      // 组合数据类型   } else {      // 简单数据类型   }

清单 2 代码通过 inst

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号