<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    實現ClassLoaderDelegateHook控制Equinox的類加載

    Equinox的設計非常經典,其在擴展方面提供了很多的支持,同樣包括類加載方面的控制,除了通過標準的org.osgi.framework.bootdelegation以及equinox提供的osgi.parentClassLoader這兩個屬性來簡單的控制類加載之外,還可通過實現ClassLoaderDelegateHook來更為靈活的控制類加載。

    對Equinox代碼進行分析,想讓擴展的ClassLoaderDelegateHook起作用,首先要能夠讓這個ClassLoaderDelegateHook注冊到Equinox中,Equinox在進行類加載的過程中會調用searchHooks來尋找ClassLoaderDelegateHook的實現,尋找的方法為獲取bundle.framework.delegateHooks屬性,而framework中的delegateHooks屬性是在initialize時通過adaptor的getHookRegistry()的getClassLoaderDelegateHooks()方法來獲取的,并且framework沒有提供setDelegateHooks或addDelegateHook這樣的方法,所以沒辦法直接設置,從這來看,是否意味著只需要在framework initialize之前通過adaptor的getHookRegistry來注冊ClassLoaderDelegateHook就可以呢,繼續看BaseAdaptor類,恩,確實通過adaptor的getHookRegistry可以來增加ClassLoaderDelegateHook,但由于啟動過程是在EclipseStarter里面完成的,BaseAdaptor是在啟動的代碼里創建的,這樣就沒辦法保證在framework initialize之前增加自己實現的ClassLoaderDelegateHook了,查看EclipseStarter代碼,幸運的是可以通過設置osgi.adaptor屬性來指定Adaptor類的名稱,于是決定繼承BaseAdaptor,在構造器中創建通過獲取HookRegistry來增加自行實現的ClassLoaderDelegateHook類,這里還有個小問題,BaseAdaptor在構造器中創建HookRegistry后調用了其initiliaze方法,而HookRegistry在initialize方法中將其私有的一個readonly屬性設置為了true,這導致的后果是無法在這之后增加ClassLoaderDelegateHook,如增加,則會拋出:IllegalStateException,錯誤信息為:Cannot add hooks dynamically,因此,在調用addClassLoaderDelegateHook之前必須通過反射先將HookRegistry中的readonly屬性設置為false,按照上面的方法,實現的關鍵代碼如下:

    // 設置自行實現的Adaptor類名
    FrameworkProperties.setProperty(EclipseStarter.PROP_ADAPTOR, CustomAdaptor.class.getName());

    public class CustomAdaptor extends BaseAdaptor {

        
    public CustomAdaptor(String[] args) {
            
    super(args);
            HookRegistry hookRegistry
    =getHookRegistry();
            
    try{
                Field readOnlyField
    =HookRegistry.class.getDeclaredField("readonly");
                readOnlyField.setAccessible(
    true);
                readOnlyField.setBoolean(hookRegistry, 
    false);
                hookRegistry.addClassLoaderDelegateHook(自行實現的ClassLoaderDelegateHook類);
            }
            
    catch(Exception e){
                
    e.printStackTrace();
            }
        }

    }

    ClassLoaderDelegateHook類則可根據自己的需求進行實現,在這個類中可靈活控制類加載的過程,接口中控制類加載的方法說明如下:
    preFindClass 
    在Equinox判斷是否需要從boot classloader中加載后,就會嘗試調用ClassLoaderDelegateHook的這個方法來加載類,如此方法拋出ClassNotFoundException,則終止類查找,因此,如果希望Hook中加載不到時繼續執行Equinox的類加載的話,在Hook中就不要拋出ClassNotFoundException。
    postFindClass
    在Equinox已經嘗試過從Bundle的import-package、require-bundle、bundle-classpath以及dynamicimport-package中加載后,會嘗試調用ClassLoaderDelegateHook的這個方法來加載類。

    上面的方法并不優雅,從Equinox設計了Hook來看,不可能要這么復雜才能增加一個Hook,于是繼續回頭看代碼,不負期望,在HookRegistry的initialize方法中,會去加載配置的osgi.hook.configurators、osgi.hook.configurators.include和osgi.hook.configurators.exclude三個屬性值或指定的hookconfigurators.properties文件,最后合并形成需要加載執行的HookConfigurator類,從上面的代碼來看,只用在自行實現的ClassLoaderDelegateHook類上再增加HookConfigurator接口的實現,并將其注冊到HookRegistry中,最后在osgi.hook.configurators中配置這個類即可,由于equinox內部已經有配置了一些HookConfigurator的,因此此處需要把equinox jar中的hookconfigurators.properties里面配置的hook.configurators也增加進去,要么就是把自己需要增加的HookConfigurator加到equinox jar的hookconfigurators.properties中,這種方法就優雅很多了,按照這種方法實現后的關鍵代碼如下:

    // 設置需要裝載的HookConfigurator的實現類
    FrameworkProperties.setProperty("osgi.hook.configurators", CustomClassLoaderDelegate.class.getName());

    public class CustomClassLoaderDelegate implements ClassLoaderDelegateHook,HookConfigurator {

        
    public Class postFindClass(String name, BundleClassLoader classloader,
                BundleData data) 
    throws ClassNotFoundException {
            
    // 自行實現
        }
        

        
    public URL preFindResource(String name, BundleClassLoader classloader,
                BundleData data) 
    throws FileNotFoundException {
            
    // 自行實現
        }

        
    public Enumeration preFindResources(String name, BundleClassLoader classloader,
                BundleData data) 
    throws FileNotFoundException {
            
    // 自行實現
        }

        
    public String postFindLibrary(String arg0, BundleClassLoader arg1,
                BundleData arg2) {
            
    // 自行實現
        }

        
    public URL postFindResource(String arg0, BundleClassLoader arg1,
                BundleData arg2) 
    throws FileNotFoundException {
            
    // 自行實現
        }

        
    public Enumeration postFindResources(String arg0, BundleClassLoader arg1,
                BundleData arg2) 
    throws FileNotFoundException {
            
    // 自行實現
        }

        
    public Class preFindClass(String arg0, BundleClassLoader arg1,
                BundleData arg2) 
    throws ClassNotFoundException {
            
    // 自行實現
        }

        
    public String preFindLibrary(String arg0, BundleClassLoader arg1,
                BundleData arg2) 
    throws FileNotFoundException {
            
    // 自行實現
        }

        
    public void addHooks(HookRegistry registry) {
            registry.addClassLoaderDelegateHook(
    this);
        }

    }

    ps: 在《OSGi原理與最佳實踐》中沒來得及寫上這部分,就在這篇blog上寫了。

    posted on 2009-07-14 11:04 BlueDavy 閱讀(6154) 評論(1)  編輯  收藏 所屬分類: OSGi、SOA、SCA

    評論

    # re: 實現ClassLoaderDelegateHook控制Equinox的類加載 2015-10-02 23:37 衡蕪公爵

    親,你可以通過一個文件注冊進去奧~~  回復  更多評論   

    公告

     









    feedsky
    抓蝦
    google reader
    鮮果

    導航

    <2009年7月>
    2829301234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    統計

    隨筆分類

    隨筆檔案

    文章檔案

    Blogger's

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久草免费福利资源站| 久久91亚洲精品中文字幕| 91九色老熟女免费资源站| 免费人成网上在线观看| 天堂亚洲国产中文在线| 中文字幕亚洲精品资源网| 亚洲精品无码MV在线观看| 亚洲福利在线播放| 日本免费人成黄页网观看视频| 国产精品怡红院永久免费| 免费视频一区二区| 本免费AV无码专区一区| 成人一级免费视频| 无遮挡a级毛片免费看| 亚洲成a人无码亚洲成av无码 | 五月婷婷免费视频| 亚洲Aⅴ在线无码播放毛片一线天 亚洲avav天堂av在线网毛片 | 亚洲精品线路一在线观看| 日本免费v片一二三区| 在线观看免费为成年视频| 在线观看av永久免费| 三年片在线观看免费观看高清电影 | www在线观看播放免费视频日本| 亚洲av无码有乱码在线观看| 亚洲色精品VR一区区三区| 亚洲日本久久久午夜精品| 亚洲av无码国产综合专区| 亚洲国产高清美女在线观看| 亚洲婷婷天堂在线综合| 亚洲无限乱码一二三四区| 亚洲日产2021三区在线| 精品亚洲AV无码一区二区三区| 亚洲综合久久一本伊伊区| 亚洲AV成人一区二区三区在线看| 久久精品国产亚洲av麻豆图片| 亚洲看片无码在线视频| 亚洲欧洲AV无码专区| 美美女高清毛片视频黄的一免费| 特级毛片全部免费播放a一级| 一级做a爰片久久免费| 成人毛片100免费观看|