亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区

當前位置:首頁 > 網站舊欄目 > 學習園地 > 設計軟件教程 > EMF開發指南之客戶端編程

EMF開發指南之客戶端編程
2010-01-14 22:44:56  作者:  來源:
★emf 運行時編程
★通過package和factory我們可以非常方便的取得class的metamodel信息,并且創建class instance。
★EClass,EPackage,EFactory提供了一些通用的方法,由此派生而來的class,package,factory則提供了更多便利的方法以供我們使用。
★訪問指定的class除了通過package的getXxxx()方法之外,還可以取得那些沒有generated的class,其用法是XxxxPackage.getEClassifier("Yyyyy")。
★通過package,我們可以遍歷訪問所有的class(以及attribute,reference,operation),datatype,enumeration
★訪問package中所有的類使用EPackage.getEClassifiers()方法,遍歷EClass所有屬性用EClass.getEAttributes()方法,遍歷reference用EClass.getEReferences()方法
★通過package創建制定類實例的幾種做法:第一種就是使用XxxxPackage.createYyyy();第二種則是先通過XxxxPackage.eINSTANCE.getYyyyy()這種方式得到相關的實例類,以及XxxxFactory.eINSTANCE得到factory實例,最后使用xxxxFactory.create(yyyyClass)創建實例。
★通過一個給定的class name和相關的package uri創建類實例,一般為了得到類實例,我們需要得到class以及factory,而這些都可以通過package取得(通過getEClassifier()和getEFactoryInstance()方法)
★EPackage是對ecore xml文件的一個序列化對象,因此可以直接使用resouce,從一個ecore文件得到package對象,實際上這是一種比較底層的做法,通常我們不這樣做,而是通過使用Package的Registry來映射到給定uri的package對象,Registry從java.util.Map繼承而來,通過uri跟一個Package或者Package.Discriptor關聯,這里的Discriptor主要在plugin模式下使用,除非真的需要Package,否則在初始化的時候將Discriptor注冊到Registry中。在需要使用Package的時候,則通過Discriptor來取得(通過調用其getEPackage()方法),通過EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(packageNsURI)方法,我得到了package,接著得到class name和factory以及最終所需要的class instance就易如反掌了。
★emf presistence framework
★emf的持久化機制主要圍繞4個接口:Resource,ResourceSet,Resource.Factory, URIConvertor。通過這4個接口便可以實現emf model的加載和保存
★URI 統一資源標識是一個標識和定義各種類型(文件、網絡、數據庫、文件對象以及數據流)資源開放標準。一個URI由三部分組成:scheme,scheme-specific以及fragment(可選)。org.eclipse.emf.common.util.URI是對URI的一種封裝,scheme標識訪問resource協議,文件為file,jar為jar,eclipse為platform
★file:/c:/dir1/dir2/myfile.xml和file:///c:/dir1/dir2/myfile.xml表示的資源是同一個,但是卻是不同的URI對象
★scheme-specific由authority,device以及其他的segment組成,authority由//打頭,device和segment都是以/打頭,uri中從#開始往后都是fragment
★emf使用帶有fragment的URI就可以引用到指定的EObject
★URIConvertor 用來將一個uri跟一個實際的uri建立映射關系,比如將一個namespace uri(http:///com/example/epo2.ecore)映射為一個物理uri(platform:/resource/project/somemodel.ecore),它還有一個功能就是normalize,也就是convert的意思,沒明白這個機制
★URIConvertor提供createInputStream() and createOutputStream()兩個方法,用來在制定的uri上打開兩個input和output stream。
★Resouce表示一個EObject集合的持久容器,可以通過URI來進行定位,Resource.getContents()的add方法向一個Resource添加一個EObject,也可以通過給容器類型的關聯添加一個引用來給Resource添加一個EObject,Resource比較重要的是save()和load()方法,這兩個方法定義了持久化的格式,還有getEObject()和getURIFragment()方法則用來使用URI查找對象
★save和load方法的實現機制:首先使用URIConvertor將指定的uri進行轉換,然后打開相應的stream,接著調用doSave和doLoad方法,這些方法交給子類去實現,在save和load兩個方法調用中會傳一個map參數,這個參數用來控制save和load的行為
★Resource.Factory 用來創建resoruce對象的,所有的factory都使用一個map的registry來加以管理,跟package的registry一樣的做法,不同之處它是根據uri scheme以及extension來進行分類注冊的。在plugin中默認情況下所有的emf model都使用XMIResourceFactoryImpl,如果要自定義factory,可以通過添加擴展點org.eclipse.emf.ecore.extension_parser,并指定自己的factory實現,一般情況下resource factory只是用來給resourceset來使用
★ResourceSet 用來管理已經load和create的resource集合,主要使用createResource(),getResource(),getEObject()這幾個方法。createResource()用于在set中創建一個空的resource對象,getResource()也會先創建一個Resource,然后用指定的resource URI去加載指定的resource,getEObject()則在已有的resource(或者根據uri調用getResource()方法先加載resource)中根據需要加載EObject,
★除了可以直接通過new以及resource.factory的createResource()方法來創建resource對象之外,也可以通過調用ResourceSet的getResource() and createResource()方法來創建(其內部會調用resource.factory的相應方法),這樣做的一個重要原因是它能夠跟蹤某個uri是否已經被打開,這樣可以避免內存里面出現兩份一樣的resource,resource set還可以按需加載當前resource對另外一個resource的引用
★使用ResourceSet的時候需要resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(Resource.Factory.Registry.DEFAULT_EXTENSION,new  XMIResourceFactoryImpl());這樣設置一把,否則會因為找不到rsourceFactory而無法使用resource

★emf resource implementation
★在生成一對一的屬性的時候,會在當前節點上以attribute的形式添加
★在生成一對多的屬性的時候,會在當前節點中以子節點的方式添加屬性
★在生成包含關系的引用的時候,會在當前節點中以子節點的方式添加引用節點
★在生成非包含關系的引用的時候,會在當前節點中以attribute的形式引用子節點的fragment,但是如果設置在被包含引用的iD屬性的話,則采用id的方式加以引用。
★在創建交叉引用的時候需要把resource的save放在所有resource生成之后。交叉引用可以使用相對路徑也可以使用絕對路徑,但是相對路徑更好一些,因為可移植性更好,要做到使用相對路徑引用,則需要在創建resource的時候使用絕對uri路徑
★如果引用存在繼承關系,那么對于引用的具體子類,會在生成的xml中添加xmi:type屬性來表明具體引用的是哪個子類

★xml輸出的定制
★OPTION_DECLARE_XML為false標識沒有xml頭聲明
★OPTION_LINE_WIDTH好像沒有效果
★OPTION_USE_ENCODED_ATTRIBUTE_STYLE 為true則總是使用uri方式來進行引用
★OPTION_SKIP_ESCAPE為true(默認為true)表示針對轉義字符(<,>,&)進行轉換
★OPTION_XML_MAP 用來將制定的節點內容進行轉換
★OPTION_ENCODING為xml設置字符集
★xml輸入定制
★OPTION_DISABLE_NOTIFY 為true取消觸發通知
★OPTION_XML_MAP 在save的時候使用了OPTION_XML_MAP,那么在load的時候也要使用

★adapter編程
★給一個model object添加一個adapter有三種方式:第一種通過model object的eAdapters屬性將一個adapter跟model關聯起來;第二種通過adapter factory的adapt方法將一個adapter與一個model object關聯起來;第三種通過擴展已有的adapter factory創建制定類型的adapter來與model object關聯。
★Notification用來封裝通知信息,這里除了getNotifier()方法返回通知的發送者之外,還包括通知的類型,發生改變的feature(即 feature id),改動前后的值,如果需要屏蔽掉非狀態改變的通知,則可以使用isTouch()方法來實現。
★通過adapter除了可以給一個model object添加一個監聽器之外,還可以用來給model object增加一些功能。其做法是先定義一個需要實現功能的接口,然后實現該接口并擴展AdapterImpl實現一個Adapter,并創建一個adapter factory來負責創建該adapter,最后通過adapter factory的adapt()方法將model object與前面定義的接口關聯起來,這樣model object就被擴展成具有該接口的一些功能了。

安徽新華電腦學校專業職業規劃師為你提供更多幫助【在線咨詢
亚洲人成网站在线播放2019 _日韩国产欧美精品_久久夜色精品国产欧美乱_在线视频福利一区
91久久久久久久久久| 亚洲精品欧美日韩| 精品一区二区国产| 日韩高清av| 久久亚洲综合国产精品99麻豆精品福利| 国产欧美在线观看| 欧美自拍视频在线观看| 日韩在线电影一区| 在线观看污视频| 制服诱惑一区| 国产999在线| 久久不射电影网| 国产精品久久久久久av下载红粉| 九九热只有这里有精品| 久久综合九色综合88i| 99精品人妻少妇一区二区| 国产精品一区二区欧美黑人喷潮水| 国产在线视频一区| 免费日韩中文字幕| 国产在线视频在线| 国内精品久久国产| 国产一区二区在线网站| 国产日韩中文字幕在线| 国产日韩在线一区二区三区| 国产裸体舞一区二区三区| 国产精品永久入口久久久| 粉嫩av一区二区三区免费观看| 99久久99久久精品| 久久综合一区二区三区| 91精品国产成人| 国产v亚洲v天堂无码久久久| 久久久噜久噜久久综合| 国产精品丝袜久久久久久高清 | 欧美一级黑人aaaaaaa做受| 青青视频免费在线| 欧美日本韩国在线| 黄页免费在线观看视频| 色琪琪综合男人的天堂aⅴ视频| 深夜福利国产精品| 国产精品乱码一区二区三区| 久久成人精品视频| 伊人天天久久大香线蕉av色| 无码中文字幕色专区| 日韩精品av一区二区三区| 精品欧美日韩在线| www.av毛片| 久久国产一区二区| 精品国产依人香蕉在线精品| 操人视频在线观看欧美| 亚洲精品无人区| 欧美综合在线播放| 国产精品自拍偷拍视频| 国产激情片在线观看| 国产精品乱码| 懂色一区二区三区av片| 欧美久久电影| 成人免费网站在线| 国产日韩欧美在线观看| 91精品国产免费久久久久久| 日韩中文字幕av| 欧美日韩成人在线播放| 欧美激情视频一区二区三区不卡| 亚洲一区二区三区四区在线播放| 日韩欧美不卡在线| 国产精品一区二区欧美黑人喷潮水| 久久久久亚洲精品| 久久久久久国产精品久久| 日韩久久不卡| 99久热re在线精品996热视频| 亚洲精品在线视频观看| 欧美一区深夜视频| 久久国产成人精品国产成人亚洲| 亚洲影院在线看| 国产日本欧美在线观看| 久久久久99精品久久久久| 日本成人精品在线| 国产成人精品999| 亚洲一卡二卡区| 国产日韩精品在线播放| 国产精品久久久久久久久电影网| 欧美在线精品免播放器视频| 国产av无码专区亚洲精品| 亚洲欧美日韩综合一区| 99热在线播放| 一级黄色免费在线观看| 成人亚洲综合色就1024| 欧美日韩电影在线观看| 国产美女精品免费电影| 九九久久久久久久久激情| 国产一区二区在线免费| 久久国产精彩视频| 国产日产欧美精品| 国产精品吹潮在线观看| 国产在线视频在线| 欧美巨大黑人极品精男| 国产一级做a爰片久久毛片男| 国产精品福利片| 国产日韩av网站| 亚洲午夜精品一区二区| 91精品国产精品| 日本午夜在线亚洲.国产| 日韩在线观看免费网站| 欧美性视频在线| 国产精品久久久久久久久免费| 蜜臀av无码一区二区三区| 久久国产精品免费视频| 99热国产免费| 性欧美激情精品| 久久久女人电视剧免费播放下载| 无码人妻精品一区二区三区66| 国产成人精品久久久| 欧美一区在线直播| 久久综合免费视频| 国产精品专区h在线观看| 性欧美长视频免费观看不卡| 久久99九九| 国产在线一区二区三区播放| 亚洲中文字幕无码中文字| 久久精品中文字幕一区二区三区| 欧洲成人在线视频| 精品中文字幕乱| 91老司机精品视频| 日本精品免费观看| 国产精品久久久久一区二区| 成 年 人 黄 色 大 片大 全| 日韩在线三级| 国产精品免费视频一区二区| 国产精品亚洲一区二区三区| 色999日韩自偷自拍美女| 国产成人精品综合| 成人免费无码av| 欧美中文字幕在线观看视频| 中文字幕精品在线播放| 久久久久久久久久久免费精品 | 国产一区视频在线| 亚洲日本欧美在线| 日韩中文字幕视频在线| 国产精品一区二区在线观看| 日韩欧美国产免费| 在线观看一区欧美| 久久精品国产综合| av无码久久久久久不卡网站| 欧美理论一区二区| 亚洲一区二区三区四区视频 | 久久精品中文字幕| 91精品国产综合久久久久久久久| 黄色国产精品一区二区三区| 亚洲国产日韩综合一区 | 欧美极品欧美精品欧美视频| 国产成人精品免费视频大全最热| 国产性生交xxxxx免费| 日韩国产精品毛片| 亚洲综合中文字幕在线| 国产精品久久久久99| 久久亚洲a v| 成人h在线播放| 国产尤物91| 黄色一级大片免费| 视频一区视频二区视频三区视频四区国产| 久久伊人91精品综合网站| 久久久久久香蕉网| 久久伊人资源站| 国产美女作爱全过程免费视频| 欧美无砖专区免费| 欧美一级片免费观看| 亚洲第一综合| 亚洲精品国产精品国自产| 美女啪啪无遮挡免费久久网站| 国产精品视频二| 俺去了亚洲欧美日韩| 国产成人精品免费久久久久| 成人免费在线网址| 国产在线精品播放| 黄色网址在线免费看| 青青青国产在线观看| 日本精品免费| 日本午夜精品一区二区三区| 亚洲砖区区免费| 一区二区三区四区不卡| 欧美精品在线播放| 国产精品久久久久久久av大片| 国产精品青青草| 国产精品久久久久av| 国产精品久久久久久亚洲调教 | 久久久成人的性感天堂| 久久久久久久久久久91| 久久久亚洲影院| 国产精彩免费视频| 久久久伊人日本| 久久久午夜视频| 91高潮在线观看| 91高清免费视频| 久久精品国产综合精品| 久久国产精品网| 久久国产亚洲精品无码| 久久精品magnetxturnbtih| 久久国产精品 国产精品| 国产av天堂无码一区二区三区| 久久草.com| 久久天堂电影网|