亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

淺析Eclipse建模框架(EMF)及其動態能力

2019-11-18 11:05:49
字體:
來源:轉載
供稿:網友

  假如給定一個模型,那么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。圖1顯示出Ecore元數據的完整的類層次結構圖。在圖1中,你可以看到EPackage包含關于模型類(EClass)和數據類型(EDataType)的信息。EClass描述一個建模的類,并且指定屬性和參考以描述實例的數據。EAttribute描述簡單數據,它由一個EDataType來指定。EReference描述一個類之間的關聯;它的類型是一個Eclass。EFactory包含創建模型元素的方法。

淺析Eclipse建模框架(EMF)及其動態能力
圖1.Ecore類層次結構:這個圖像顯示出Ecore元數據完整的類層次。

  為找到更多關于EMF和Ecore,請讀在線概述或購買Eclipse建??蚣?EMF)。EMF網站提供了若干文件來描述怎么使用EMF來從一個XML模式或UML圖表生成Java代碼。

  下面我將描述一個示例,它使用Ecore來創建一個簡單公司模型,然后使用動態的EMF來創建,串行化和反串行化這個模型的實例。假如你想繼續讀下去并且你已經是一個Eclipse用戶,請下載和安裝EMF 2.1 SDK或任何可用的更新的版本,在EMF下載站點。假如不那樣,你還可以下載獨立包,它包括EMF jar文件,它沒有任何對Eclipse的依靠性并且能被使用于一個獨立的應用程序。
三、 使用動態EMF能力

  一般地,假如你在開發期間創建了模型,那么典型情況下,你最好生成Java代碼,因為在這種情況中你的應用程序會使用較少的內存并且提供更快的數據存取(或是使用生成的API或是使用反射API)。盡管生成Java代碼滿足了大多數應用程序的需要,但是情況并不總是如此。你可能需要處理數據,而不需要使用生成的實現類。例如,你可能不知道在開發時間你將要處理的數據的模型,這就使得生成的Java代碼成為一個可憐的選項。

  動態的(也就是非生成的)類可以在運行時刻用幾種方法來創建。讓我們先開始使用Ecore API以編程地方式來創建一個公司模型。公司模型用于描述一個公司,它有一個名稱和部門。每個部門由一個數字來唯一標志出并且它還有雇員,每個雇員有一個名稱。在下面的代碼顯示出一個相應于該模型的Ecore元模型。

EcoreFactory ecoreFactory = EcoreFactory.eINSTANCE;
EcorePackage ecorePackage = EcorePackage.eINSTANCE;
//創建一Company類
EClass companyClass = ecoreFactory.createEClass();
companyClass.setName("Company");
//創建公司名
EAttribute companyName = ecoreFactory.createEAttribute();
companyName.setName("name");
companyName.setEType(ecorePackage.getEString());
companyClass.getEStrUCturalFeatures().add(companyName);
//創建一Employee類
EClass employeeClass = ecoreFactory.createEClass();
employeeClass.setName("Employee");
//在Employee類上添加一個名字屬性
EAttribute employeeName = ecoreFactory.createEAttribute();
employeeName.setName("name");
employeeName.setEType(ecorePackage.getEString());
employeeClass.getEStructuralFeatures().add(employeeName);
//創建一Department類
EClass departmentClass = ecoreFactory.createEClass();
departmentClass.setName("Department");
//添加department標志數字
EAttribute departmentNumber = ecoreFactory.createEAttribute();
departmentNumber.setName("number");
departmentNumber.setEType(ecorePackage.getEInt());
departmentClass.getEStructuralFeatures().add(departmentNumber);
//department類能夠包含到一個或多個employee的參考
EReference departmentEmployees = ecoreFactory.createEReference();
departmentEmployees.setName("employees");
departmentEmployees.setEType(employeeClass);
//指定它可能是一個或多個employee
departmentEmployees.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
departmentEmployees.setContainment(true);
departmentClass.getEStructuralFeatures().add(departmentEmployees);
//company能夠包含到一個或多個departments的參考
EReference companyDepartments = ecoreFactory.createEReference();
companyDepartments.setName("department");
companyDepartments.setEType(departmentClass);
companyDepartments.setUpperBound(ETypedElement.UNBOUNDED_MULTIPLICITY);
companyDepartments.setContainment(true);
companyClass.getEStructuralFeatures().add(companyDepartments);
//創建一個包-描述company
EPackage companyPackage = ecoreFactory.createEPackage();
companyPackage.setName("company");
companyPackage.setNscompanyPackage.setNsURI("http:///com.example.company.ecore");
companyPackage.getEClassifiers().add(employeeClass);
companyPackage.getEClassifiers().add(departmentClass);
companyPackage.getEClassifiers().add(companyClass);
通過使用反射API,你能創建并且初始化一個你的模型的實例:
//得到company工廠
EFactory companyFactory = companyPackage.getEFactoryInstance();
//使用工廠來創建company類的實例并且
//設置company名字
EObject company = companyFactory.create(companyClass);
company.eSet(companyName, "MyCompany");
//創建一個employee類的實例
EObject employee = companyFactory.create(employeeClass);
//使用反射API初始化employee的名字
employee.eSet(employeeName, "John");
//創建一個department類的實例
EObject department = companyFactory.create(departmentClass);
department.eSet(departmentNumber, new Integer(123));
//添加"John"到department
((List)department.eGet(departmentEmployees)).add(employee);
//添加department到company
((List)company.eGet(companyDepartments)).add(department);
  四、 數據的串行化和反串行化

  為了串行化你的模型實例,你需要把一個你的實例模型的根對象放置到一個資源中。EMForg.eclipse.emf.ecore.resource.Resource接口描述了一個物理的存儲位置(例如文件或URL)并且提供方法以串行化和裝載數據。每一種資源都被存儲在一個ResourceSet中-它代表了一個資源集合-這些資源被一起創建和加載并答應在它們當中進行參考引用。非凡地,一個ResourceSet負責跟蹤哪些資源已被裝載并且保證這個ResourceSet中的資源不會被重復裝載。

  因為EMF能夠處理多重模型源,例如XML模式,所以指定使用哪些資源來實現(反)串行化你的數據也是很重要的。通常,當你調用ResourceSet.createResource(URI)方法時,它查詢Resource.Factory.Registry來查找一個工廠-該工廠是為該URI而注冊的并且使用它來創建一個適當的資源實現。因此,在你(反)串行化你的數據以前,請確保你已注冊了適當的資源工廠實現。EMF提供若干Resource.Factory實現:

  ·對于XML數據,使用org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl。

  ·對于XMI數據,使用org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl。

  ·對于Ecore模型,使用org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl。

  你的工具箱中有了這些EMF資源后,你就能使用下面的代碼來串行化你的數據:

//創建資源集和資源
ResourceSet resourceSet = new ResourceSetImpl();
//注冊XML資源工廠
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xmi",
new XMIResourceFactoryImpl());
Resource resource = resourceSet.createResource(URI.createFileURI("c:/temp/company.xmi"));
//添加根對象到資源
resource.getContents().add(company);
//串行化資源-你還能指定串行化
//選項,它定義在org.eclipse.emf.ecore.xmi.XMIResource中
resource.save(null);
company.xmi被串行化后的形式如下:
<?xml version="1.0" encoding="ASCII"?>
<company:Company xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
xmlns:company="http:///com.example.company.ecore" name="MyCompany">
<department number="123">
<employees name="John"/>
</department>
</company:Company>

  在反串行化過程中,XML數據的命名空間URI被用于定位所需要的Ecore包(它用于描述你的實例文檔的模型)。因此,在你嘗試裝載任何模型以前,請確保你已經為你的文檔將要使用的每個Ecore包注冊了命名空間URI:

//在本地資源
注冊表中注冊包
resourceSet.getPackageRegistry().put(companyPackage.getNsURI(), companyPackage);
//加載資源
resource.load(null);

  注重到局部的和全局的包(EPackage.Registry.INSTANCE)以及資源工廠(Resource.Factory.Registry.INSTANCE)的注冊差別也是很重要的。全局注冊是靜態的,因此任何應用程序在JVM生存期都能存取全局注冊并且可能覆蓋它。為確保你的注冊不會覆蓋全局注冊并且反過來也如此,典型地,你最好使用局部資源集合注冊。

  五、 由XML模式生成動態的Ecore

  如前所提及,假如你的模型是一個XML模式但是你沒有選擇生成Java類,那么,你可以通過使用XSDEcoreBuilder來動態地創建一個Ecore模型。這個示例使用了ipo.xsd:

XSDEcoreBuilder xsdEcoreBuilder = new XSDEcoreBuilder();
ResourceSet resourceSet = new ResourceSetImpl();
Collection eCorePackages =xsdEcoreBuilder.generate(URI.createFileURI("c:/temp/ipo.xsd"));

  這個generate方法返回為這個模式中的每個URI生成的Ecore包。假如該模式導入了其它命名空間,那么將有多個Ecore包被返回。每個包是被注冊到本地的資源集中-用于實現模式轉換。因此,假如你使用同樣的資源集來裝載你的實例XML文檔的話,你就不需要自己注冊包。

  因為XML模式包括更多概念而不僅僅是Ecore,例如通配符等,所以EMF使用Ecore EAnnotations來記錄到XML模式的映射。在數據(反)串行化期間,EMF需要處理這些注解。為了確保這些注解在(反)串行化期間被加以考慮,你必須使用XMLResource.ExtendedMetaData選項:

HashMap options = new HashMap();
options.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
//請參考http://www.w3.org/TR/2004/PER-xmlschema-0-20040318/#ipo.xml
Resource resource = resourceSet.createResource(URI.createFileURI("c:/temp/ipo.xml"));
resource.load(options);

  EMF 2.1還增加了一項新功能-它答應你在加載一個包含一個xsi:schemaLocation或xsi:noNamespaceSchemaLocation屬性的XML文檔時,不斷地把模式轉換成Ecore。同時,它也答應你加載一個沒有與之相關聯的模式的XML文檔。為了使用這一功能,你需要注冊 org.eclipse.emf.ecore.xmi.impl.GenericXMLResourceFactoryImpl:

resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("xml",new GenericXMLResourceFactoryImpl());
  六、 小結

  本文向你簡短介紹了EMF,并解釋了幾個核心的EMF概念。同時,對于如何利用模式EMF的動態能力提供了相關示例。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲综合日韩在线| 性视频1819p久久| 亚洲japanese制服美女| 国产在线视频一区| 日韩精品在线免费观看| 久久亚洲精品一区二区| 韩国日本不卡在线| 欧美国产日韩中文字幕在线| 国产亚洲激情视频在线| 国产精品永久免费| 在线播放精品一区二区三区| 亚洲国产精品视频在线观看| 国产成人精品电影| 欧美成年人网站| 国产成人精品日本亚洲专区61| 日韩高清欧美高清| 欧美性猛交xxxx乱大交3| 欧美丰满老妇厨房牲生活| 精品视频—区二区三区免费| 久久精品电影网站| 国产精品综合网站| 欧美日韩一区免费| 黑人与娇小精品av专区| 91免费福利视频| 日韩在线观看网址| 国产精品久久久亚洲| 欧美视频专区一二在线观看| 亚洲精品成人网| 欧美高清第一页| 欧美精品免费在线观看| 亚洲精品永久免费精品| 插插插亚洲综合网| 波霸ol色综合久久| 日韩欧美aⅴ综合网站发布| 国产亚洲精品激情久久| 久久国产天堂福利天堂| 国产原创欧美精品| 欧美视频中文在线看| 蜜月aⅴ免费一区二区三区| 成人性生交大片免费观看嘿嘿视频| 亚洲欧美日韩精品久久奇米色影视| 97在线观看免费| 成人亚洲欧美一区二区三区| 国产精品av网站| 日韩在线视频网站| 日韩成人激情在线| 欧美成人亚洲成人| 亚洲欧美日韩国产精品| 亚洲无限乱码一二三四麻| 亚洲男女自偷自拍图片另类| 在线观看视频亚洲| 欧美午夜视频一区二区| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲图片欧洲图片av| 国产精品一区二区女厕厕| 欧美日韩电影在线观看| 成人福利网站在线观看11| 97**国产露脸精品国产| 国产精品久久久久aaaa九色| 亚洲专区在线视频| 日韩免费电影在线观看| 久久免费少妇高潮久久精品99| 国产精品久久久久久久美男| 78m国产成人精品视频| 色综合色综合久久综合频道88| 欧美一级免费视频| 国产精品免费看久久久香蕉| 亚洲影院色在线观看免费| 日韩电视剧免费观看网站| 午夜精品久久久久久久男人的天堂| 成人a免费视频| 欧美日本国产在线| 亲爱的老师9免费观看全集电视剧| 亚洲欧美另类在线观看| 日韩一级黄色av| 日韩美女视频免费在线观看| 国产精品扒开腿做爽爽爽的视频| 亚洲黄色免费三级| 精品国产乱码久久久久久虫虫漫画| 日韩精品在线免费观看视频| 国产精品久久久久久av| 国产精品狠色婷| 国产精品视频一区国模私拍| 日韩精品亚洲精品| xvideos成人免费中文版| 精品性高朝久久久久久久| 亚洲一区二区三区香蕉| 国产999精品久久久影片官网| 精品女同一区二区三区在线播放| 91国内揄拍国内精品对白| 深夜精品寂寞黄网站在线观看| 日韩av免费看| 国产精品久久久久影院日本| 久久久久久久久亚洲| 久久精品国产亚洲一区二区| 最近2019好看的中文字幕免费| 国产精品一区二区三区免费视频| 欧美在线激情网| 日韩精品免费综合视频在线播放| 日韩精品在线播放| 久久夜色精品国产欧美乱| 69av在线视频| 国产亚洲激情视频在线| 国产精品综合网站| 日韩美女视频免费在线观看| 欧美国产视频日韩| 欧美韩国理论所午夜片917电影| 国产成人精品在线视频| 亚洲美女福利视频网站| 欧美老少配视频| 国产成人精品综合久久久| 好吊成人免视频| 日韩欧美一区二区三区| 欧美高清视频一区二区| 亚洲天堂av在线播放| 日本一区二区三区在线播放| 亚洲人成在线播放| 最近2019中文字幕mv免费看| 欧美日韩在线视频一区| 丝袜美腿精品国产二区| 久久影院中文字幕| 91午夜理伦私人影院| 中文字幕在线精品| 国产剧情久久久久久| 国产午夜精品久久久| 91精品国产免费久久久久久| 日韩精品极品在线观看| 97超级碰碰碰久久久| 欧美国产在线电影| 亚洲japanese制服美女| 国产欧美精品xxxx另类| 久久久成人av| 欧美日韩国产在线看| 91精品国产91久久久久久吃药| 亚洲欧美日本另类| 亚洲国产精品va在线| 91国内免费在线视频| 日av在线播放中文不卡| 麻豆乱码国产一区二区三区| 亚洲精品成人久久电影| 精品久久久久国产| 国产免费一区二区三区香蕉精| 国产成人免费av| 2021国产精品视频| 国产婷婷97碰碰久久人人蜜臀| 亚洲乱码一区av黑人高潮| 91在线免费看网站| 亚洲午夜未删减在线观看| 欧美猛男性生活免费| 亚州成人av在线| 国产精品亚洲视频在线观看| 91久久久久久久久久久久久| 国产日产欧美精品| 国产视频精品久久久| 91视频国产一区| 91免费看片网站| 国产亚洲欧美日韩精品| 91久久久久久久久久久久久| 精品国产一区二区三区久久狼黑人| 久久久久久久久爱| 国内精品在线一区| 日韩中文av在线| 亚洲精品免费av| 久久亚洲影音av资源网|