日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

java類加載器學(xué)習(xí)1——類加載器的基本概念

系統(tǒng) 2030 0

一、程序使用java類的運(yùn)行順序

當(dāng)程序主動(dòng)使用某個(gè)類的時(shí)候,若該類還未被加載至內(nèi)存中,系統(tǒng)會(huì)通過(guò) 加載,連接,初始化 三個(gè)步驟對(duì)類進(jìn)行初始化,有事也把這三個(gè)步驟稱為類加載或者類的初始化。

1 類的加載

將被編譯的.java而成為.class字節(jié)碼讀入JVM內(nèi)存并為之創(chuàng)建一個(gè)java.lang.Class對(duì)象,也就是說(shuō)當(dāng)程序中使用任何類的時(shí)候系統(tǒng)都會(huì)為之建立一個(gè)java.lang.Class對(duì)象。類的加載由類加載器完成,類加載器通常有JVM提供,我們稱JVM提供的類加載器為系統(tǒng)類加載器。當(dāng)然實(shí)際的情況可能更加復(fù)雜比如Java字節(jié)代碼可能是通過(guò)工具動(dòng)態(tài)生成的,也可能是通過(guò)網(wǎng)絡(luò)下載的。

2 類的連接

當(dāng)生成一個(gè)對(duì)應(yīng)的.class對(duì)象后,接著會(huì)進(jìn)入連接階段,會(huì)將類的二進(jìn)制數(shù)據(jù)合并到JRE中,該階段又認(rèn)為驗(yàn)證,準(zhǔn)備,解析三個(gè)階段。

3 類的初始化

由JVM負(fù)責(zé)對(duì)類進(jìn)行初始化,主要就是對(duì)靜態(tài)屬性進(jìn)行初始化。(1)聲明靜態(tài)屬性時(shí)指定初始值 (2)使用靜態(tài)初始化塊為靜態(tài)屬性指定初始值。

本文主要講解第一個(gè)步驟——類的加載。

二、類的加載的基本概念

基本上所有的類加載器都是java.lang.ClassLoader類的一個(gè)實(shí)例。 java.lang.ClassLoader類的基本職責(zé)就是根據(jù)一個(gè)指定的類的名稱,找到或者生成其對(duì)應(yīng)的字節(jié)代碼,然后從這些字節(jié)代碼中定義出一個(gè)Java類,即java.lang.Class類的一個(gè)實(shí)例。 除此之外ClassLoader還負(fù)責(zé)加載Java應(yīng)用所需的資源,如圖像文件和配置文件等。不過(guò)本文只討論其加載類的功能。為了完成加載類的這個(gè)職責(zé),ClassLoader提供了一系列的方法。JDK中幾個(gè)比較重要的方法:


getParent()
返回委托的父類加載器

loadClass(String name)
加載名稱為name的類,返回的結(jié)果是java.lang.Class類的實(shí)例

findClass(String name)
查找名稱為name的類,返回的結(jié)果是java.lang.Class類的實(shí)例

findLoadedClass(String name)
查找名稱為 name的已經(jīng)被加載過(guò)的類,返回的結(jié)果是 java.lang.Class類的實(shí)例

defineClass(String name, byte[] b, int off, int len)
把字節(jié)數(shù)組b中的內(nèi)容轉(zhuǎn)換成Java類,返回的結(jié)果是java.lang.Class類的實(shí)例。此方法被聲明為final

resolveClass(Class<?> c)
鏈接指定的Java類


上述name是 二進(jìn)制名 ,按照《Java Language Specification》的定義,任何作為String類型參數(shù)傳遞給ClassLoader中方法的類名稱都必須是一個(gè)二進(jìn)制名稱。 有效類名稱的示例 包括:

"java.lang.String"
"javax.swing.JSpinner$DefaultEditor"
"java.security.KeyStore$Builder$FileBuilder$1"
"java.net.URLClassLoader$3$1"

三、類加載器的分類

Java 中的類加載器大致可以分成兩類,一類是系統(tǒng)(JVM)提供的,一類是由Java應(yīng)用開(kāi)發(fā)人員編寫(xiě)的。

系統(tǒng)提供的類加載器主要有下面三個(gè):

引導(dǎo)類加載器(bootstrap class loader)
用來(lái)加載 Java 的核心庫(kù),是用原生代碼(C++)來(lái)實(shí)現(xiàn)的,并不繼承自java.lang.ClassLoader。


擴(kuò)展類加載器(extensions class loader)
用來(lái)加載Java的擴(kuò)展庫(kù)。Java虛擬機(jī)的實(shí)現(xiàn)會(huì)提供一個(gè)擴(kuò)展庫(kù)目錄。該類加載器在此目錄里面查找并加載 Java 類。


系統(tǒng)類加載器(system class loader)
根據(jù)Java應(yīng)用的類路徑(CLASSPATH)來(lái)加載Java類。一般來(lái)說(shuō)Java應(yīng)用的類都是由它來(lái)完成加載的??梢酝ㄟ^(guò) ClassLoader.getSystemClassLoader()來(lái)獲取它。

除了系統(tǒng)提供的類加載器外開(kāi)發(fā)人員可以通過(guò)繼承java.lang.ClassLoader類的方式實(shí)現(xiàn)自己的類加載器,以滿足一些特殊的需求。

除了引導(dǎo)類加載器外,所有的類加載器都有一個(gè)父類加載器。 通過(guò)getParent()方法可以得到。對(duì)于系統(tǒng)提供的類加載器來(lái)說(shuō),系統(tǒng)類加載器的父類加載器是擴(kuò)展類加載器,而擴(kuò)展類加載器的父類加載器是引導(dǎo)類加載器;對(duì)于開(kāi)發(fā)人員編寫(xiě)的類加載器來(lái)說(shuō),其父類加載器是加載此類加載器Java類的類加載器。因?yàn)轭惣虞d器Java類如同其它的Java類一樣,也要由類加載器來(lái)加載的。一般來(lái)說(shuō)開(kāi)發(fā)人員編寫(xiě)的類加載器的父類加載器是系統(tǒng)類加載器。類加載器通過(guò)這種方式組織起來(lái),形成樹(shù)狀結(jié)構(gòu)。樹(shù)的根節(jié)點(diǎn)就是引導(dǎo)類加載器。 看一張傳智播客的圖

java類加載器學(xué)習(xí)1——類加載器的基本概念

看一段測(cè)試代碼

    public class Test
{

 public static void main(String[] args)
 {

  // sun.misc.Launcher$AppClassLoader
  System.out.println(Test.class.getClassLoader().getClass().getName());

  // null
  // 類加載器本身也是java類,也需要被加載,但是第一個(gè)加載器如果是java類的話,被誰(shuí)來(lái)加載呢?
  // 答案BootStrap是第一個(gè)類加載器,是C++代碼寫(xiě)成的二進(jìn)制代碼,這里通過(guò)java獲取不了
  System.out.println(System.class.getClassLoader());

  // sun.misc.Launcher$AppClassLoader——>sun.misc.Launcher$ExtClassLoader——>null
  ClassLoader loader = Test.class.getClassLoader();
  while (null != loader)
  {
   System.out.println(loader.getClass().getName());
   loader = loader.getParent();
  }
  System.out.println(loader);
 }

}


  


四、類加載器的父類委托機(jī)制

Java的類加載器自從JDK1.2開(kāi)始便引入了一條機(jī)制,叫做父類委托機(jī)制。

一個(gè)類需要被加載的時(shí)候,JVM先會(huì)調(diào)用他的父類加載器進(jìn)行加載。如果父類加載器加載不了,再使用其子類進(jìn)行加載。 當(dāng)然這類所說(shuō)的父類加載器,不一定他們之間是繼承的關(guān)系,有可能僅僅是包裝的關(guān)系。不能片面理解。


當(dāng)Java虛擬機(jī)要加載類時(shí),如果上一級(jí)加載器可以加載則交由上一級(jí)加載,如用戶編寫(xiě)一個(gè)java.lang.System類,交給AppClassLoader加載—>ExtClassLoader加載—>BootStrap加 載,而rt.jar這個(gè)包中本來(lái)就有一個(gè)System類,所以用戶編寫(xiě)的System類不起作用。如果BootStrap加載不到,則將由ExtClassLoader加載—>AppClassLoader加載,最后還加載不了就返回ClassNotFoundException異常,不會(huì)交給發(fā)起請(qǐng)求的加載器的子加載器。

Java之所以出現(xiàn)這條機(jī)制,因?yàn)槭翘幱诎踩钥紤]。害怕用戶自己定義class文件然后自己寫(xiě)一個(gè)類加載器來(lái)加載原本應(yīng)該是JVM自己加載的類。這樣會(huì)是JVM虛擬機(jī)混亂或者說(shuō)會(huì)影響到用戶的安全。

參考地址

http://www.ibm.com/developerworks/cn/java/j-lo-classloader/index.html#major5

http://blog.csdn.net/a352193394/article/details/7343385

java類加載器學(xué)習(xí)1——類加載器的基本概念


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!??!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 德钦县| 仪征市| 顺昌县| 江山市| 龙口市| 山丹县| 昭通市| 台南县| 含山县| 富裕县| 卢湾区| 通州区| 来凤县| 竹山县| 中宁县| 龙门县| 延寿县| 祁门县| 印江| 高青县| 西充县| 棋牌| 敦煌市| 垣曲县| 南阳市| 筠连县| 礼泉县| 乌拉特前旗| 扎赉特旗| 沙坪坝区| 澄迈县| 大方县| 唐海县| 郑州市| 郎溪县| 衡阳市| 金湖县| 临城县| 信阳市| 南华县| 咸丰县|