浅析Eclipse建模框架(EMF)及其动态能力

如果给定一个模型,那么EMF能够自动生成Java源代码-该源码允许你创建、查询、更新、串行化、反串行化、检验和追踪你的模型实例的变化。EMF提供了一组有效的反射API并且允许你用动态的(非生成的)模型进行工作。

一、引言

Eclipse建模框架(EMF)是一个Java开源框架与代码生成工具-用于基于结构化的模型来构建工具和其它应用程序。在Eclipse平台在用户界面和文件级上提供一个强有力的集成框架的同时,EMF加强了这种能力来实现工具和应用程序之间良好粒度的数据分享。

类似于其它的Java绑定框架,例如JAXB或XMLBeans,给定一个模型后,EMF就能够生成Java源代码-它允许你创建、查询、更新、反串行化以及串行化你的模型的实例。尽管多数Java绑定框架仅支持一个模型类,例如XML模式,而EMF支持从XML模式,UML类图(Rational Rose或UML2)以及被注解的Java接口中生成代码。除了模型代码,EMF还能生成一个完整的应用程序-它包括一个可定制的编辑器。

EMF生成的代码有一个内建的改变通知机制并且支持跨文档参考。EMF提供一个反射API以存取你的模型实例并且允许你动态地创建模型。EMF支持模型约束校验。EMF提供强有力的代码生成工具来支持模型的重新生成和使用用户书写的代码进行合并。

在本文中,我们将解释什么是EMF,并分析其基本框架。

EMF最开始是一个对象管理组的(OMG)元对象设备(MOF)说明书的实现-它为面向对象的分析和设计提供一个标准化的元模型。在很长一段时间以来,EMF被用于实现大量的工具并且因此演变为一个有效的MOF API的一个核心子集的Java实现。

在EMF中的类MOF核心元模型(一个模型的模型)被称作Ecore。在对当前的MOF 2.0的实现中,有一个类似的MOF模型的子集,称作Essential MOF(EMOF),它现在已经被独立出来。在Ecore和EMOF之间主要存在上些小的特别是命名上的区别,因此EMF能透明地读和写串行化的EMOF,从而允许工具间数据的标准交换。

今天EMF已被广泛应用。例如,EMF被用于实现开源XML模式Infoset模型(XSD),服务数据对象(SDO),UML2以及Eclipse上的Web工具平台(WTP)工程。另外,EMF也被使用在商业化的产品中,例如Omondo EclipseUML以及IBM Rational和WebSphere产品等。

二、Ecore和反射API

EMF中的一个关键接口是Eobject,它在概念上等价于java.lang.Object。所有的建模对象,无论是生成的与否,为了提供以下几个重要特征,都要实现这个接口:

·类似Java的Object.getClass(),通过使用eClass()方法,你能检索实例的元数据,也就是它的Eclass。

·在任何EMF建模的对象上,你都能使用反射API(eGet(),eSet())来存取它的数据。这在概念上等同于Java的java.lang.reflect.Method.invoke()方法,尽管效率更高些。

·从任何实例对象,你都可以通过使用eContainer()方法得到它的容器(parent)。

·EObject也扩展了Notifier,这允许你监视对象的数据的所有变化。

为找到更多关于EMF和Ecore,请读在线概述或购买Eclipse建模框架(EMF)。EMF网站提供了若干文件来描述怎么使用EMF来从一个XML模式或UML图表生成Java代码。

下面我将描述一个示例,它使用Ecore来创建一个简单公司模型,然后使用动态的EMF来创建,串行化和反串行化这个模型的实例。如果你想继续读下去并且你已经是一个Eclipse用户,请下载和安装EMF 2.1 SDK或任何可用的更新的版本,在EMF下载站点。如果不那样,你还可以下载独立包,它包括EMF jar文件,它没有任何对Eclipse的依赖性并且能被使用于一个独立的应用程序。

时间: 2025-01-08 00:32:38

浅析Eclipse建模框架(EMF)及其动态能力的相关文章

《圣殿祭司的ASP.NET4.0专家技术手册》----2-3 C# 4.0静态基础融入动态能力

2-3 C# 4.0静态基础融入动态能力 圣殿祭司的ASP.NET4.0专家技术手册 在了解静态与动态语言后,大家直觉上可能会以为这是二元的对立,非黑即白,不是静态语言,就是动态语言.但您是否想过静态和动态之间是可以兼具或混合的可能性?例如,静态语言为获取动态语言优点,而融入了一些动态语言的功能,然后又保持静态语言的优势,如类型安全.优化.高效率. 是的,.NET 4.0正是以这个方向去改造,在原本C#.VB静态语言基础上,加上动态语言的一些特性与优势,这样就达到以静态为主,动态为辅之目的,让C

《中国人工智能学会通讯》——11.28 统一先验建模框架 II:整数规划

11.28 统一先验建模框架 II:整数规划 在上一章中,利用约束谱聚类框架来求解视觉物体分割问题,其能很好地处理可以建模为一阶.二阶或高阶局部数据约束的先验信息.但有些先验知识,例如全局数据约束和模型先验,却无法或很难利用该框架来建模或求解.例如图 8 所示,左图的"边缘点所在类别的面积占全图的比率要大于一定 50%",中图的"每个运动物体上的特征点轨迹位于一个二到四维的线性投影子空间上",以及右图的"汽车和电视很少出现在同一张图片中",这三种

《中国人工智能学会通讯》——11.27 统一先验建模框架 I:约束谱聚类

11.27 统一先验建模框架 I:约束谱聚类 仅仅利用颜色.纹理等底层特征仅能得到关于图像的过分割,如图 1 中所示即为用文献 [1] 中方法得到的层次化分割结果.在第 2 章和第 3 章中,已经尝试利用多多视觉信号来实现视觉物体分割,在本章和下一章中,将尝试利用各种先验信息来实现语义物体分割.考虑图 5 中的先验信息,它们分别刻画了数据 点和类别的关系(一阶数据先验).两个数据点间的关系(二阶数据先验),以及多个数据点件的关系(三阶数据先验).这些先验信息有些是硬性的,例如上左的交互信息和上中

基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架_node.js

前言 使用Node做前后端分离的开发模式带来了一些性能及开发流程上的优势, 但同时也面临不少挑战.在淘宝复杂的业务及技术架构下,后端必须依赖Java搭建基础架构,同时提供相关业务接口供前端使用.Node在整个环境中最重要的工作之一就是代理这些业务接口,以方便前端(Node端和浏览器端)整合数据做页面渲染.如何做好代理工作,使得前后端开发分离之后,仍然可以在流程上无缝衔接,是我们需要考虑的问题.本文将就该问题做相关探讨,并提出解决方案. 由于后端提供的接口方式可能多种多样,同时开发人员在编写Nod

OMCS使用技巧 -- 摄像头及其动态能力

      在开发类似视频聊天的应用时,我们经常需要获取摄像头的相关信息:而在进行视频聊天时,我们可能还希望有一些动态的能力.比如,在不中断视频聊天的情况下,切换一个摄像头.或者修改摄像头采集的分辨率或编码质量等等.OMCS提供了很多有用的特性以支持上述需求. 一.枚举摄像头       我们如何得知当前的计算机有哪些摄像头了?       OMCS提供了一个工具类OMCS.Tools.Camera,来帮助我们获取这些信息.Camera有个静态方法GetCameras,用于枚举当前计算机上的所有

构建插件式的应用程序框架(三)-动态加载

不管你采用什么方式实现插件式的应用程序框架,核心还是动态加载,换句话说,没有动态加载技术也就无所谓插件式的应用程序框架了.使用Com实现的话,你可以利用Com的API通过ProgID来动态创建COM对象,如果使用普通DLL,你需要使用Windows 的API函数LoadLibrary来动态加载DLL,并用GetProcAddress函数来获取函数的地址.而使用.NET技术的话,你需要使用Assembly类的几个静态的Load(Load,LoadFile,LoadFrom)方法来动态加载汇集. 一

专家答疑:虚拟世界中的动态能力规划

1.数据挖掘定义与分类 数字档案馆,作为传统实体档案馆在信息时代的新型组织形式,是实体档案馆在信息时代不断创新和发展的必然,是迎接知识经济时代挑战,拓展传统实体档案馆功能,满足用户需求,提供个性化.多样化服务的关键,也是提高社会档案意识的新契机.那么,如何从数字档案馆浩如烟海的大量数字化资源中提炼.挖掘出有价值的,对数字档案馆进行知识积累.知识创新有着数据支撑作用的有效信息,这是未来数字档案馆建设所面临的重要课题.数据挖掘技术正是解决这一难题的有效途径,数据挖掘是当今计算机领域的热点,其成果也广

深入浅析Java注解框架_java

我们经常会在java代码里面看到:"@Override","@Target"等等样子的东西,这些是什么? 在java里面它们是"注解". 下面是百度百科的解释:java.lang.annotation.Retention可以在您定义Annotation型态时,指示编译器如何对待您的自定义 Annotation,预设上编译器会将Annotation资讯留在class档案中,但不被虚拟机器读取,而仅用于编译器或工具程式运行时提供资讯. 也就是说,注解

浅析JS刷新框架中的其他页面 && JS刷新窗口方法汇总_javascript技巧

先来看一个简单的例子:下面以三个页面分别命名为frame.html.top.html.bottom.html为例来具体说明如何做.frame.html 由上(top.html)下(bottom.html)两个页面组成,代码如下: 复制代码 代码如下: <! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >< HTML >< HEAD >< TITLE > frame