精彩的人生

          好好工作,好好生活

          BlogJava 首頁(yè) 新隨筆 聯(lián)系 聚合 管理
            147 Posts :: 0 Stories :: 250 Comments :: 0 Trackbacks

                  好像利用Eclipse自定義擴(kuò)展點(diǎn)的人不多。

                  在我以前做的項(xiàng)目中,用了自定義擴(kuò)展點(diǎn),但是使用這個(gè)擴(kuò)展點(diǎn)的文件也在這個(gè)項(xiàng)目中,整個(gè)項(xiàng)目就是一個(gè)插件。所以,加載擴(kuò)展點(diǎn)的方式很簡(jiǎn)單:

           1IExtensionRegistry registry = Platform.getExtensionRegistry();
           2IExtensionPoint point = registry.getExtensionPoint(“org.eclipse.ui.popupMenus”);
           3IExtension[] extensions = point.getExtensions();
           4for (int i = 0; i < extensions.length; i++){
           5    IConfigurationElement[] elements = extensions.getConfigurationElements();
           6          for (int j = 0; j < elements.length; j++){
           7                String eleType = elements[j].getName();
           8                Class importantClass = Class.forName(element[j].getAttribute(MyConstants.ATTR_MODELCLASS)).newInstance();
           9                ……
          10          }

          11}

                  在一個(gè)插件項(xiàng)目中,這樣的代碼一點(diǎn)問(wèn)題都沒(méi)有。

                  但是,我現(xiàn)在的項(xiàng)目分為幾個(gè)插件,擴(kuò)展點(diǎn)的定義放在了插件項(xiàng)目A中,相關(guān)的接口和擴(kuò)展點(diǎn)實(shí)現(xiàn)收集器(這是我自己取的名字)也在A中,但是擴(kuò)展點(diǎn)的實(shí)現(xiàn)是其他的插件,比如插件B就實(shí)現(xiàn)了A中定義的擴(kuò)展點(diǎn)。那么他們之間的依賴(lài)關(guān)系是

          A  <----------  B

                  換句話說(shuō),在A中看不到B中的代碼,那么問(wèn)題就來(lái)了:上面那段代碼的第8行將會(huì)報(bào)出class not found的異常。

                  如何解決這個(gè)問(wèn)題?

                  可能是我對(duì)Eclipse的核心代碼太不熟悉了,所以這個(gè)問(wèn)題困擾了我很久。

                  解決的方法是,將第8行替換為

          WorkbenchPlugin.createExtension(element, MyConstants.ATTR_MODELCLASS);

                 這個(gè)方法將激活本次實(shí)現(xiàn)所在的插件項(xiàng)目的Bundle,問(wèn)題就解決了。

               
          posted on 2005-12-14 14:04 hopeshared 閱讀(2272) 評(píng)論(8)  編輯  收藏 所屬分類(lèi): Eclipse

          Feedback

          # re: 從擴(kuò)展點(diǎn)中l(wèi)oad class 2005-12-14 14:57 SimonLei
          element.createExecutableExtension 就行了,不用那么復(fù)雜  回復(fù)  更多評(píng)論
            

          # re: 從擴(kuò)展點(diǎn)中l(wèi)oad class 2006-07-28 18:28 joan
          老兄,我剛接觸eclipse,現(xiàn)在正好用到自定義擴(kuò)展點(diǎn)呀,可網(wǎng)上的資料也很少,看了ECLIPSE的幫助后只知道怎么編輯擴(kuò)展點(diǎn)模式,但不知道你上面寫(xiě)的那些代碼該放在什么地方?能否給小妹發(fā)一份有關(guān)自定義擴(kuò)展點(diǎn)和如何擴(kuò)展的完整的資料呢,先謝了!郵箱是john_82@tom.com  回復(fù)  更多評(píng)論
            

          # re: 從擴(kuò)展點(diǎn)中l(wèi)oad class 2006-07-30 10:32 hopeshared
          @joan

          看看這個(gè)http://www.aygfsteel.com/hopeshared/archive/2006/07/25/59983.html  回復(fù)  更多評(píng)論
            

          # re: 從擴(kuò)展點(diǎn)中l(wèi)oad class 2006-07-31 12:28 joan
          @hopeshared
          謝謝你!看了你的那篇文章我明白了許多,但是還有個(gè)問(wèn)題想請(qǐng)教一下:如果我在A插件自定義了一個(gè)擴(kuò)展點(diǎn)X,在B.C或更多的插件擴(kuò)展了這個(gè)擴(kuò)展點(diǎn),那我希望從插件A中能知道哪些插件擴(kuò)展了X擴(kuò)展點(diǎn),以及從A中獲取B.C...插件里的一些文件,該怎么辦呢?
            回復(fù)  更多評(píng)論
            

          # re: 從擴(kuò)展點(diǎn)中l(wèi)oad class 2006-08-02 16:55 寒風(fēng)
          期待hopeshared對(duì)樓上問(wèn)題的解惑  回復(fù)  更多評(píng)論
            

          # re: 從擴(kuò)展點(diǎn)中l(wèi)oad class 2006-08-02 20:55 hopeshared
          回復(fù)joan

          我不明白你為什么會(huì)有這樣的疑問(wèn),因?yàn)檫@個(gè)帖子說(shuō)的就是你問(wèn)的這個(gè)問(wèn)題,帖子中的代碼就是在A插件中找出所有擴(kuò)展點(diǎn)X的實(shí)現(xiàn)

          IExtensionPoint point = registry.getExtensionPoint(“org.eclipse.ui.popupMenus”);
          得到A中定義的這個(gè)擴(kuò)展點(diǎn)對(duì)象

          IExtension[] extensions = point.getExtensions();
          得到所有擴(kuò)展點(diǎn)X的實(shí)現(xiàn)

          extensions[i]是擴(kuò)展點(diǎn)X的一個(gè)實(shí)現(xiàn)

          IConfigurationElement[] elements = extensions[i].getConfigurationElements();
          將得到B,C的plugin.xml中如何實(shí)現(xiàn)該擴(kuò)展點(diǎn),也就是對(duì)應(yīng)的那段xml

          elements[j].getAttribute("your attribute")得到這個(gè)屬性的值,如elements[j].getAttribute("targetID")就是指<... targetID="aaaa"/>將返回aaaa
          elements[j].getName()將返回這個(gè)元素的名稱(chēng),如<target .../>就該返回target,這兩個(gè)其實(shí)就可以看作DOM操作了

          你說(shuō)的“從A中獲取B.C...插件里的一些文件”,那么你定義擴(kuò)展點(diǎn)的時(shí)候就必須考慮,你需要什么文件,假如你需要一個(gè)類(lèi),<... targetClass="ClassA">,前面已經(jīng)說(shuō)明了如何得到"ClassA"這樣的字符串,我寫(xiě)的這篇blog也是由于直接用Class.forName("ClassA")無(wú)法創(chuàng)建類(lèi)的實(shí)例,那么用
          WorkbenchPlugin.createExtension(element, "targetClass");
          就可以了

          所以,你的問(wèn)題,根源在于如何定義擴(kuò)展點(diǎn),而不是如何找出擴(kuò)展點(diǎn)的實(shí)現(xiàn)。
            回復(fù)  更多評(píng)論
            

          # re: 從擴(kuò)展點(diǎn)中l(wèi)oad class 2006-08-07 12:48 joan
          @hopeshared
          呵呵,問(wèn)題已經(jīng)解決了,謝謝你!
            回復(fù)  更多評(píng)論
            

          # re: 從擴(kuò)展點(diǎn)中l(wèi)oad class 2006-08-17 01:32 寒風(fēng)
          hopeshared,能否將‘如何定義擴(kuò)展點(diǎn)’的東東發(fā)一些給我?謝謝
          tie212@163.com  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 无锡市| 资阳市| 平谷区| 类乌齐县| 沂水县| 盐池县| 门头沟区| 汽车| 南涧| 定日县| 宜良县| 邵东县| 双峰县| 铁力市| 棋牌| 苍山县| 阿尔山市| 彰武县| 拉萨市| 东乌珠穆沁旗| 诸暨市| 宣威市| 克什克腾旗| 洪雅县| 阜城县| 临沭县| 古蔺县| 临沧市| 微博| 靖安县| 慈利县| 开江县| 绥阳县| 麟游县| 沙坪坝区| 旅游| 西乡县| 聊城市| 吉安市| 丰镇市| 武功县|