Welcome 微信登录

首页 / 软件开发 / JAVA / 基于反射机制的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 类型 的实例。