基于反射机制的EMF模型比较 - 编程入门网
基于反射机制的EMF模型比较时间:2011-09-09 IBM 石立川 王芹华 邵兵简介:本文基于 EMF(Eclipse Modeling Framework)模型反射机制,实现 了一种 EMF 模型对象比较的方法,并展示如何使用该算法得出对象的匹配程度 。首先设定对象的待比较字段列表。对其中的每个字段,获取并比较对象的字段 值。在比较的过程中,该算法将组合数据类型(如自定义类、列表)的比较分解 为其子数据类型的比较。模型比较的结果是一个差异项列表,作为后续应用的基 础,可以被用于版本控制、模型导入 / 导出等场景中。 EMF 和 Ecore 简介 Eclipse Modeling Framework(EMF)是一个开放源代码的模型驱动应用程序 开发框架。它可以基于 XML Schema、UML 或带有模型特征注释的 Java 接口, 创建 Java 代码,实现图形化的数据编辑、操纵、读取和序列化。EMF 是 IBM WebSphere Studio 和 Eclipse 项目中很多工具的基础。 Ecore 元模型是 EMF 框架的核心,它描述 EMF 模型并且提供模型的运行时 支持,包括:模型修改通知,以默认的 XMI 序列化提供 EMF 的持久化支持,以 及通用于操作 EMF 对象的高效反射 API。本文正是运用 EMF 的反射 API 读取 EMF 对象的值,在此基础上完成 EMF 对象的比较。 图 1. Ecore 类型树 图 1 为 Ecore 的类型树。图中灰色填充背景表示在 EMF 框架中,该接口的 实现类为抽象类,黄色填充背景的接口有非抽象的实现类。对图中与本文相关的 类型介绍如下: EAttribute:用来描述一个属性,它拥有一个名字和类型。EAttribute 描述 简单数据 , 它由一个 EDataType 来指定。 EClass:是 EMF 对象的元类型,用来描述建模模型。它以属性(EAttribute )和引用(EReference)描述建模类的字段(Field)。类似 Java 的 Object.getClass() 得到的 Class,调用 EObject 对象的 eClass() 方法可以 得到 EClass。 EDataType:用来描述一个属性的类型,这个属性必须是简单数据类型,包括 基本(primitive type)数据类型如:int,一个 Java 类型如 String,也可以 是一个数组。 EFactory:为一个抽象工厂,它包含创建建模对象的方法。 EObject:由图 1 可见,EObject 为所有 EMF 建模对象的基类型 ( 或称超 类型 ),在 EMF 框架内类似于 java.lang.Object。为了区别于用户建模中的方 法名,EObject 接口中所定义的方法名都以"e"开头。如 eClass() 方法返回一 个 EMF 对象的元模型 (EClass)。 EPackage:在 Ecore 中,EPackage 包含关于模型类 (EClass) 和数据类型 (EDataType) 的信息,如何得到 EPackage 的实例和得到模型类的信息在后面将 详细介绍。 EReference:用来描述类之间的关联关系,EReference 有名称;一个描述包 含关系的布尔标志位(包含与否决定这两个类型之间的关系是聚合 (Aggregation )或者组合(Compostition));一个 reference( 目标 ) 类 型,用来指定关系的类型,由于关联关系是两个类型之间的关系,所以 EReference 总是指向组合数据类型。 EStructureFeature:是 EReference 和 EAttribute 的共同超类。在理解上 可以将其作为字段(Field)。因为 EStructuralFeature 的实现是抽象类,所 以得到的 EStructuralFeature 对象一定是 EAttribute 或者 EReference 类型 的实例。 基于反射机制的EMF模型比较(2)时间:2011-09-09 IBM 石立川 王芹华 邵兵EMF 的反射 API 反射的概念是由 Smith 在 1982 年首次提出的,主要是指程序可以访问、检 测和修改它本身状态或行为的一种能力。EMF 框架也提供了反射机制的接口及实 现。EMF 提供的反射机制是一个强大的工具。它使得代码更加灵活,这些代码可 以在运行时装配,而不是在编码阶段就将某些连接进行固定。对任何 EMF 对象 ,都可 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |