成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Equinox加載Bundle Class的實現

開發 后端
對于想使用Equinox來構建OSGi應用的同學們而言,掌握Equinox是如何加載Bundle中的Class無疑是相當重要的,這樣在碰到各類ClassNotFoundException的時候也就有底了,否則可能出現的ClassNotFoundException會多的讓你非常的頭疼。

Equinox在創建Bundle的ClassLoader時,首先獲取bundle的classpath,然后執行createBCLPrevileged方法,此方法***轉交由BaseData來創建ClassLoader。

BaseDate創建ClassLoader的關鍵代碼片段為:

  1. ClassLoadingHook[] hooks = adaptor.getHookRegistry().getClassLoadingHooks(); 
  2.     ClassLoader parent = adaptor.getBundleClassLoaderParent(); 
  3.     BaseClassLoader cl = null
  4.     for (int i = 0; i < hooks.length && cl == null; i++) 
  5.        cl = hooks[i].createClassLoader(parent, delegate, domain, this, bundleclasspath); 
  6.     if (cl == null
  7.        cl = new DefaultClassLoader(parent, delegate, domain, this, bundleclasspath); 
  8.     return cl; 

在Equinox中,默認的情況下adaptor.getBundleClassLoaderParent返回的為bootstrap classloader,可通過修改啟動的osgi.parentClassLoader 來改變這個parent classloader,

osgi.parentClassLoader 的可選值有四個,分別是:

l boot : 默認

l app : SystemClassLoader

l ext : SystemClassLoader的parent

l fwk : 啟動Equinox的ClassLoader

ClassLoadingHook在createClassLoader的時候都沒有做動作,因此***ClassLoader都是通過創建DefaultClassLoader對象來構建的,其中parent參數為null,delegate參數為BundleLoader實例,bundleclasspath參數為bundle的classpath。

經過以上步驟后,完成了ClassLoader的創建,可以開始加載class了,根據上面上述,Bundle的Class就由DefaultClassLoader來完成了。

查看DefaultClassLoader的loadClass代碼,發現真正的加載class的過程是轉為調用了delegate 的findClass來完成的,delegate參數對應的為BundleLoader實例,轉為跟蹤BundleLoader的findClass方法。

BundleLoader的findClass方法的代碼片段:

  1. if (checkParent && parentCL != null && name.startsWith(JAVA_PACKAGE)) 
  2.    return parentCL.loadClass(name); 

從以上這個代碼片段,可以看到,Equinox將java.開頭的類轉交給了parent classloader去加載,這也意味著沒必要在系統中提供對外export java.開頭的package。

如果不是java.開頭的類,則交由findClassInternal方法來完成加載。

findClassInternal方法遵循的為OSGi規范中定義的Class的加載順序,不過仍然稍有改動:

1) 判斷是否交由parent classloader去完成加載

在啟動Equinox時,Equinox會讀取org.osgi.framework.bootdelegation屬性,該屬性對應配置的為需要從parent classloader中加載的package,如值配置的為*,說明所有的都從parent classloader中加載 ,如值配置的為具體的package,那么則放入bootDelegation集合;如配置的為帶通配符的package,那么則放入bootDelegationStems集合。

判斷時Equinox首先判斷是否所有的都從parent classloader中加載,如是則從parent classloader中加載;

如需要加載的類的package位于bootDelegation或bootDelegationStems集合中,那么同樣從parent classloader中加載。

如不從parent classloader中加載,則進入下面的步驟。

2) 嘗試調用Equinox提供的ClassLoaderDelegateHook的擴展來加載

Equinox對外提供了ClassLoaderDelegateHook的接口擴展,可編寫ClassLoaderDelegateHook的實現,注冊到Framework中,那么當有Class需要加載等動作時都會得到通知。

在默認情況下,Equinox中沒有ClassLoaderDelegateHook的實現,因此繼續下面的步驟。

3) 判斷是否在import-package中,如在則交由相應的PackageSource去加載

根據Bundle配置的import-package,判斷目前需要加載的類是否在import-package中,如在則交由對應的PackageSource進行加載,PackageSource在加載時即直接交由對應的Bundle的classloader去加載,如加載的類的package在import-package中,但加載后仍然沒有找到Class,則直接拋出ClassNotFoundException,如加載到,則直接返回。

如所需要加載的類的package不在import-package中,則繼續下面的步驟。

4) 嘗試從require-bundle中加載

嘗試使用require-bundle來加載,如加載到,則直接返回,如加載不到,則繼續下面的步驟。

5) 嘗試從當前Bundle中加載

直到經過以上步驟的嘗試,才嘗試由當前Bundle中加載,當前Bundle加載的方法即從Bundle-Classpath或當前Bundle的Fragment中查找相應名稱的class文件,并讀取該文件進行加載,如class文件已加載,則進行緩存,再次加載時則不需要查找和解析class文件。

如從當前Bundle中仍然未找到所需的類,則繼續下面的步驟。

6) 嘗試從DynamicImport-Package中加載

判斷需要找的類的package是否在DynamicImport-Package中,如果在,則交由相應的PackageSource進行加載,如PackageSource中加載不到,則拋出ClassNotFoundException;如不在DynamicImport-Package中,則繼續下面的步驟。

7) 再次嘗試調用Equinox提供的ClassLoaderDelegateHook的擴展來加載

這步和第2)步相同,因此在默認情況下繼續下面的步驟。

8) 嘗試使用eclipse的buddy機制來加載

Buddy機制是Eclipse的擴展,并不符合OSGi規范,因此在此不做深入分析。

9) 判斷一定的條件,如符合則從parent classloader中加載

判斷的條件為:parent classloader不為null、不從parent classloader中加載、Equinox的向后兼容屬性(osgi.compatibility.bootdelegation)為true以及jvm的bug class,如滿足以上條件,則嘗試從parent classloader中加載。

如經過以上所有步驟后,仍然未找到需要加載的class,則拋出ClassNotFoundException。

從上面的代碼分析中,在Equinox中可以通過osgi.parentClassLoader、org.osgi.framework.bootdelegation來控制從Bundle ClassLoader外來加載Class,這對于集成Equinox其他容器而言,非常有用,另外,還可以通過實現ClassLoaderDelegateHook來改變Class的加載。

原文鏈接:http://www.cnblogs.com/buildinglife/articles/2228454.html

編輯推薦:

  1. Flex與Java中的Object交互
  2. 選用Ibatis和Hibernate的區別
  3. 淺談Struts2與Webwork的不同和相同點
  4. 開源框架spring詳解-----AOP的深刻理解
  5. 如何在Hibernate中使用union

 

責任編輯:林師授 來源: building block的博客
相關推薦

2009-06-01 11:28:48

EquinoxOSGi入門

2009-06-18 10:03:57

EquinoxOSGi應用服務器

2009-06-10 18:12:38

Equinox動態化OSGi動態化

2020-01-06 11:50:25

LinuxEquinox桌面

2020-10-19 09:09:46

Class文件加載過程

2009-06-01 11:37:46

EquinoxOSGi服務器

2009-10-15 15:12:39

Equinox服務器端Equinox

2012-05-21 13:24:03

JavaEclipseEquinox

2012-06-13 01:47:42

EclipseEquinox

2022-01-04 10:25:32

Go參數加載

2021-01-29 10:36:20

Bundle文件Apple

2009-09-16 17:15:19

OSGi Bundle

2022-10-12 08:38:51

C語言classC++

2011-07-22 13:30:52

JavaScript

2009-12-29 17:47:36

Silverlight

2013-06-27 11:16:27

Android異步加載

2020-12-30 08:01:07

Java隔離加載

2009-09-29 09:16:23

啟動bundleOSGi

2023-04-28 07:44:44

MyBatis查詢SQL

2022-01-28 09:01:49

架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩av在线不卡 | 久国久产久精永久网页 | 91精品国产综合久久精品图片 | 男女视频免费 | 欧美一区二区在线播放 | 成人久久久久 | 羞羞的视频免费观看 | 国产精品成人国产乱一区 | 国产超碰人人爽人人做人人爱 | 中文字幕三区 | 粉嫩一区二区三区国产精品 | a视频在线观看 | 欧美精品一区二区三区在线 | 国产精品亚洲一区二区三区在线 | 男人的天堂在线视频 | 日韩久久精品视频 | av高清毛片 | 日韩一二区 | 亚洲国产二区 | 自拍视频一区二区三区 | 国产一级电影在线观看 | 国产精品免费在线 | 国产精品久久久久久久久久久久久久 | 欧美精品电影一区 | 91久久国产综合久久91精品网站 | 精品国产鲁一鲁一区二区张丽 | 在线看片国产精品 | 久久成人在线视频 | 九九亚洲 | 国产伦精品一区二区三区视频金莲 | 亚洲欧美视频一区 | 精品久久久久久亚洲精品 | 91.色 | 国产精品视频97 | 国产精品一区二区av | 久久免费看 | 99久久久久久久久 | 国产精品视频免费观看 | 一级中国毛片 | 日本三级网站在线 | 日本亚洲精品成人欧美一区 |