emf开发
Eclipse Modeling Framework(EMF)描述了数据模型,并允许从不同类型的数据模型工件(例如XML Schema,RationalRose®模型,Ecore模型或Java注释)轻松生成代码。 在代码生成过程中,EMF生成器会创建模型代码,其中包括类型安全接口和数据模型的实现类。 但是,在某些情况下,应用程序不需要这些类型安全的接口和实现类。 相反,需要可以在应用程序组件之间共享或由应用程序组件进一步处理的数据对象。
在这种情况下,动态EMF派上用场,因为它允许应用程序开发人员在运行时以编程方式制造内存中的核心模型,动态地创建其实例,并使用EMF反射API访问模型实例元素。
为什么选择动态EMF?
Dynamic EMF的主要价值在于,它允许您在运行时仅用几行代码即可构建基于Ecore的模型,然后出于各种目的创建和访问此动态模型的实例。 以这种方式构建核心模型有助于避免在不需要接口和实现类时生成它们。
这种创建模型和模型实例的方法在(但不限于)以下场景中特别有用:
- 不需要类型安全的接口或实现类 -只需在应用程序组件之间共享简单的数据对象。 在这种情况下,使用EMF代码生成器生成模型代码对于应用程序来说将是开销,因为它将不必要地维护和部署整个生成的接口/类集。 使用动态EMF,可以动态地创建和实例化包含动态类的核心模型。 然后,这些动态类的实例可用于共享数据或由应用程序组件进行进一步处理。
- 数据模型仅在运行时已知 —在这种情况下,由于在开发时不知道数据模型,因此通过EMF代码生成器创建静态模型不是一个好的选择。 可以在运行时构建和实例化的动态核心模型将更适合此类情况下的应用程序需求。
创建动态内存核心模型
我们首先以编程方式构建基于动态Ecore的模型,然后创建该模型的动态实例。 稍后,我们将看到如何读写模型实例中存在的元素的值。
创建基于Ecore的动态模型/元模型
我们将考虑一个书店模型来演示动态Ecore模型的创建。 为了清楚起见,我们使用统一建模语言(UML)表示模型。
图1. BookStore模型
我们首先创建一组核心模型元素,包括一个EcoreFactory
实例,一个EcorePackage
实例,两个EClass
实例和一个EPackage
实例。 参见清单1。
清单1.创建核心模型元素
/*
* Instantiate EcoreFactory
*/
EcoreFactory theCoreFactory = EcoreFactory.eINSTANCE;
/*
* Create EClass instance to model BookStore class
*/
EClass bookStoreEClass = theCoreFactory.createEClass();
bookStoreEClass.setName("BookStore");
/*
* Create EClass instance to model Book class
*/
EClass bookEClass = theCoreFactory.createEClass();
bookEClass.setName("Book");
/*
* Instantiate EPackage and provide unique URI
* to identify this package
*/
EPackage bookStoreEPackage = theCoreFactory.createEPackage();
bookStoreEPackage.setName("BookStorePackage");
bookStoreEPackage.setNsPrefix("bookStore");
bookStoreEPackage.setNsURI("http:///com.ibm.dynamic.example.bookstore.ecore");
所述EcoreFactory
提供方法来创建像模型元素EClass
, EAttribute
, EPackage
等。使用的实例EcoreFactory
,我们创建了两个EClass
实例:一个用于表示BookStore
类和其它来表示Book
类(如在指定的BookStore
模型) 。 接下来,我们创建一个EPackage
,最终将在其中放置BookStore
和Book
类。 然后,我们定义bookStoreEPackage
的名称和nsPrefix