Java類載入器初探

來源:互聯網
上載者:User

 

簡介:類載入器(class loader)是Java中的一個很重要的概念。類載入器負責載入Java類的位元組代碼到Java虛擬機器中。本文首先詳細介紹了Java類載入器的基本概念,Java虛擬機器內建的幾種類載入器,以及Java開發中CLASSPATH設定中的一些誤區。

類載入器是Java語言的一個創新,也是Java語言流行的重要原因之一。它使得Java類可以被動態載入到Java虛擬機器中並執行。類載入器從JDK1.0就出現了,最初是為了滿足Java Applet的需要而開發出來的。Java Applet需要從遠程下載Java類檔案到瀏覽器中並執行。現在類載入器在WEB容器和OSGI中得到了廣泛的使用。一般來說,Java應用的開發人員不需要直接同類載入器進行互動。Java虛擬機器預設的行為就已經足夠滿足大多數情況的需求了。不過如果遇到了需要與類載入器進行互動的情況,而對類載入器的機會又不是很瞭解的話,就很容易花大量的時間去調試ClassNotFoundException和NoClassDefFoundError等異常。類載入器的概念:顧名思義,類載入器(class loader)用來載入Java類到虛擬機器中。一般來說,Java虛擬機器使用Java類的方式如下:Java源檔案(.java)在經過Java編譯器編譯之後就被轉換成Java位元組代碼(.class檔案)。類載入器負責讀取Java位元組代碼,並轉換成java.lang.Class類的一個執行個體。每個這樣的執行個體用來表示一個Java類。通過執行個體的newInstance()方法就可以建立出該類的一個對象。實際的情況可能更複雜,比如Java位元組代碼可能是通過工具動態產生的,也可能是通過網路下載的。中間可能還經過連結,驗證等環節。
Java類載入器的機制:Java類載入過程採用父親委託機制,這種機制能更好地保證Java平台的安全。在此委託機制中,除了Java虛擬機器內建的根類載入器外,其餘的類載入器都只有一個父載入器。當Java程式請求載入器loader1載入Sample類時,loader1首先委託自己的父載入器去載入Sample類,若父載入器能載入,則由父載入器完成載入任務,否則則由載入器loader1本身載入Sample類。Java虛擬機器內建了哪些類載入器?●根(bootstrap)類載入器:也稱為引導類載入器。該載入器沒有父載入器,它負責載入虛擬機器的核心類型,比如java.lang.*等。在後面的測試代碼中看到java.lang.Object就是由根類載入器載入的。更準確地說,根類型器(bootstrap)從系統屬性sun.boot.class.path所指定的目錄中載入類庫。根類載入器的實現依賴於底層作業系統,屬性虛擬機器的實現的一部分,本身並不是用java寫的,可能是c/c++,所以它並沒有繼承java.lang.ClassLoader類。●擴充(Exstension)類載入器:它的父載入器為根類載入器。它從java.ext.dirs系統屬性所指定的目錄中載入類庫,如果把使用者建立的jar檔案放到這個目錄下,它也會自動由擴充器載入。擴充類載入器是純Java類。是java.lang.ClassLoader類的子類。後面會提到ClassPath的設定誤區。●系統(System)類載入器:也稱為應用類載入器,它的父載入器為擴充類載入器。它從環境變數classpath或者系統屬性java.class.path所指定的目錄中載入類,它是使用者自訂的類載入器的預設父載入器。如後面提到的Person類。系統類別載入器是純Java類,是java.lang.ClassLoader的子類。測試與驗證測試test1:測試jvm內建的幾個類載入器package com.jfans;public class ClassLoaderTest1 {public static void main(String[] args) {     System.out.println(String.class.getClassLoader());//根(引導)類載入器     System.out.println(Object.class.getClassLoader());//根(引導)類載入器     System.out.println(Person.class.getClassLoader());//系統類別載入器,自訂的Person類          System.out.println(sun.net.spi.nameservice.dns.DNSNameService.class.getClassLoader());     ClassLoader loader = ClassLoader.getSystemClassLoader();//返回系統類別載入器(在虛擬機器啟動時就會產生) System.out.println(loader);}}結果:nullnullsun.misc.Launcher$AppClassLoader@82ba41sun.misc.Launcher$ExtClassLoader@923e30sun.misc.Launcher$AppClassLoader@82ba41結果說明:輸出為null即表示是根類載入器test2:返回幾個與class loader相關的幾個路徑package com.jfans;public class ClassLoaderTest3 {public static void main(String[] args) {String sunBootClassPath = System.getProperty("sun.boot.class.path");System.out.println("sunBootClassPath: " + sunBootClassPath);    String javaExtDirs = System.getProperty("java.ext.dirs");    System.out.println("extDir: " + javaExtDirs);    String javaClassPath = System.getProperty("java.class.path");    System.out.println("javaClassPath: " + javaClassPath);    System.out.println(java.lang.ClassLoader.class.getClassLoader());}}結果:sunBootClassPath: E:/DevelopmentTools/JDK5.0/Java/jdk1.5.0_05/jre/lib/rt.jar;E:/DevelopmentTools/JDK5.0/Java/jdk1.5.0_05/jre/lib/i18n.jar;E:/DevelopmentTools/JDK5.0/Java/jdk1.5.0_05/jre/lib/sunrsasign.jar;E:/DevelopmentTools/JDK5.0/Java/jdk1.5.0_05/jre/lib/jsse.jar;E:/DevelopmentTools/JDK5.0/Java/jdk1.5.0_05/jre/lib/jce.jar;E:/DevelopmentTools/JDK5.0/Java/jdk1.5.0_05/jre/lib/charsets.jar;E:/DevelopmentTools/JDK5.0/Java/jdk1.5.0_05/jre/classesextDir: E:/DevelopmentTools/JDK5.0/Java/jdk1.5.0_05/jre/lib/extjavaClassPath: D:/workspace_job/ClassLoader/bin說明:測試平台為windows xp,jdk5.0,jdk安裝目錄為E:/DevelopmentTools/JDK5.0/Java/

說明:rt.jar是由根類載入器載入的,rt為runtime的縮寫,裡面是核心java類。Classpath設定的誤區:經常看到一些人和一些Java教材上寫設定classpath內容為:.;%JAVA_HOME%/jre/lib/rt.jar;後面可能還接有其它jar。通過上面的理論部分和測試結果可知,rt.jar實際上已經由根類載入器載入了。所以classpaht中根本沒有必要設定%JAVA_HOME%/jre/lib/rt.jar;只需要設定為:.(目前的目錄)即可。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.