EMF Framework提供了模型变化通知、持久化支持、操纵EMF对象的反射API等功能来帮助用户提高工作效率,下面分别详细介绍一下。
1.Notification and Adapter
EMF生成的每一个类还是一个Notifier类型,因此当它的属性或者引用改变的时候可以发出通知。这是一个很重要的性质,通过监听EObject的变
化可以及时地更新视图或者与之相关联的对象。EMF中的Notification
Observer(Listener)叫做Adapter,它除了监听事件以外,还可以扩展其它行为(extend
behavior)等。一个Adapter可以通过如下的方式添加到任何一个EObject对象上(比如PurchaseOrder):
<!---->
Adapter poObserver
=
aPurchaseOrder.eAdapters().add(poObserver);
然后,当aPurchaseOrder的状态发生变化时(比如setBillTo方法发生了),poObserver的notifyChanged()方法会被调用。
EContentAdapter
,可以添加到一个根元素,一个资源或者一个resource set,它可以监听这些元素的任何子元素的状态变化.
Adapter在实现behavior extension(比如不通过继承来实现某个接口的功能)的功能时,是通过AdapterFactory来完成的。比如:
<!---->POAdapter adapter
=
(POAdapter)somePOAdaterFactory.adapt(someObject,POAdapter.
class
);
这样,POAdapter类型的adapter对象被添加到了对象someObject上。
2.Object Persistence
EMF对任何model的默认的序列化方式是XMI。有两个跟序列化相关的函数:eContainer()和eResource().下面通过例子来看这两个方法的作用:
<!---->PurchaseOrder order
=
POFactory.eINSTANCE.createPurchaseOrder();
order.setBillTo("123 Maple Street");
Item item = POFactory.eINSTANCE.createItem();
item.setProductName("Apples");
item.setPrice(0.45);
item.setQuantity(20);
order.getItems.add(item);
这里PurchaseOrder和Item分别是模型中代表订单和订单项的类。这时如果调用item.eContainer()会返回order对象。但
是如果调用order.eContainer()则会返回null,因为它没有被包含在任何元素里边。这时order和item的eResource()
方法都会返回null。
为了序列化这些对象,我们应该把它们加入到一个Resource里边。Resource是一个代表吴立存储位置(如文件)的接口。我们只需要把根元素加入到Resource中即可。
<!---->
Resource resource
=
;
resource.getContents().add(order);
这时order和item的eResource()方法都会返回resource对象,其中item是通过order加入到resource中去的。这时调用resource.save(null)后两个对象就保存下来了。
但是,如何取得resource呢?可以借助于EMF中的ResourceSet, 它是创建Resource的工厂,就是一系列resource的集合。
<!---->ResourceSet resourceSet
=
new
ResourceSetImpl();
URI fileURI = URI.createFileURI(new File("mypo.xml").getAbsolutePath());
Resource resource = resourceSet.createResource(fileURI);
resource.getContents().add(order);
resource.save(null);
保存完成之后,如何读取呢?
<!---->PurchaseOrder order
=
(PurchaseOrder)resource.getContents().get(
0
);
ResourceSet还支持跨文档的引用(cross-document
reference),当遇到跨文档的引用时,先用proxy对象来代替实际的对象,当第一次真正使用这个对象的时候才resolve成真正的对象。
Proxy是一个关于目标类的一个未初始化的对象,但是它拥有实际对象的URI。
3.The Reflective EObject API
EObject defines a generic,reflective API for manipulating instances.
<!---->EClass orderClass
=
POPackage.eINSTANCE.getPurchaseOrder();
EAttribute shipToAttribute = POPackage.eINSTANCE.getPurchaseOrder_shipTo();
orderClass.eSet(shipToAttribute, "123 street");
String shipTo = orderClass.eGet(shipToAttribute);
上面调用orderClass的eSet和eGet方法比直接调用order的setShipTo()和getShipTo()效率要低一些,因为它要
switch做一些条件判断,但是它的优点是open up the model for completely generic
access.EMF.Edit中的AddCommand,SetCommand等通用的命令就是通过这种方式实现的。
4.Dynamic EMF
在没有生成模型中各个类的代码之前,我们也可以使用他们的对象,如下:
<!---->EPackage
package
=
EcoreFactory.eINSTANCE.createEPackage();
EClass orderClass = EcoreFactory.eINSTANCE.createEClass();
orderClass.setName("PurchaseOrder");
package.getEClassifiers().add(orderClass);
EClass itemClass =
EcoreFactory.eINSTANCE.createEClass();
itemClass.setName("Item");
package.getEClassifiers().add(itemClass);
EAttribute shipToAttribute = EcoreFactory.eINSTANCE.createAttribute();
shipToAttribute.setName("shipTo");
shipToAttribute.setEType(EcorePackage.eINSTANCE.getEString());
orderClass.getEAttributes().add(shipToAttribute);
...
接下来,我们可以这样初始化这些类的对象:
<!---->EFactory factory = package.getEFactoryInstance();
EObject order = factory.create(orderClass);
order.eSet(shipToAttribute, “123 street");
至此,EMF的基本知识就介绍完了,如果你只是需要EMF产生的Model Code,那么需要学习的东西就这么多了。如果你还需要EMF产生的Edit Code和Editor Code,那么还有另外的知识需要学习。
分享到:
相关推荐
### Eclipse Modeling Framework (EMF) Developer Guide 知识点概览 #### 1. EMF 框架程序员指南 **EMF Framework Programmer's Guide** 部分为开发人员提供了深入理解 EMF 核心框架所需的知识。这部分涵盖了如何...
总的来说,EMF Developer Guide是学习和应用EMF的关键参考资料,它为开发者提供了一个强大而灵活的工具,使模型驱动开发变得更加简单和高效。通过EMF,你可以利用模型的力量,提升软件开发的质量和效率。
### EMF自学笔记知识点详述 #### 一、EMF框架概述 EMF(Eclipse Modeling Framework)是Eclipse项目中的一个子项目,它提供了一套用于构建模型驱动的开发工具和应用程序的框架。EMF的主要目标是简化元数据驱动应用...
### EMF Eclipse Modeling Framework 第二版 #### 一、概述 《EMF Eclipse Modeling Framework》第二版是由 Dave Steinberg、Frank Budinsky、Marcelo Paternostro 和 Ed Merks 四位专家编写的权威指南。本书是...
Addison.Wesley.Eclipse.Modeling.Framework.A.Developers.Guide 中文版
**微软EMF文件格式详解.pdf**:这份文档很可能是微软官方或第三方专家提供的关于EMF格式的详细指南。通常,它会涵盖EMF的基本结构、记录类型、图形操作、颜色管理、图元定义等内容。通过阅读这份文档,读者可以了解...
#### 二、EMF格式背景与特点 EMF格式的出现主要是为了满足日益增长的高质量图形处理需求。传统的WMF格式虽然也能够存储矢量图形信息,但在处理高分辨率输出时存在一定的局限性,尤其是在不同分辨率下无法保证图像...
Eclipse Modeling Framework: A Developer's Guide By Frank Budinsky, David Steinberg, Ed Merks, Raymond Ellersick, Timothy J. Grose Publisher : Addison Wesley Pub Date : August 11, 2003 ISBN : 0-...
imdb2emf:创建 EMF 模型或 TGraphs 的 IMDb 解析器这个小工具从 IMDb 文件创建一个 EMF 模型(或 )。用法您可以克隆这个存储库并安装 Leiningen 来解析 IMDb 文件,也可以下载一个没有依赖项的预编译 JAR。用法:...
EMF(Enhanced Metafile)文件是Windows操作系统中使用的一种矢量图形和图元文件格式。这种文件类型被广泛用于存储图形、图像和打印数据,因为它支持复杂的图形操作,如曲线绘制、渐变填充和透明效果。EMF文件是GDI+...
EMF (Enhanced Metafile) 是Windows操作系统中用于存储矢量图形和光栅图像的文件格式,它在处理复杂的图形和图像是非常有效。而PNG(Portable Network Graphics)则是一种无损压缩的位图格式,广泛应用于网页设计、...
EMF(Eclipse Modeling Framework)是Eclipse基金会下的一个开源项目,主要用于构建基于模型的软件开发环境。它为开发者提供了强大的模型化工具和框架,支持元数据驱动的开发模式,使得软件设计、开发、验证和维护的...
EMF(Enhanced Metafile)和WMF(Windows Metafile)是两种常见的矢量图形文件格式,主要用于存储图像数据,特别是在Windows操作系统环境下。这两种格式都允许无损缩放和复杂图形的绘制,但EMF是WMF的增强版本,提供...
这个"SVG转EMF"的示例代码提供了在Java环境下进行这种转换的方法。首先,你需要一个能够解析SVG并将其转换为图形对象的库,例如Batik,这是一个由Apache基金会开发的开源SVG工具集。 Batik提供了一个SVG渲染器,可以...
Java开发工具EMF插件是Java开发者在进行模型驱动工程(Model Driven Engineering,MDE)时常用的一个强大工具。EMF(Eclipse Modeling Framework)是Eclipse IDE的一部分,它提供了一种框架和API,用于构建基于模型...