1. 程式人生 > >JAVA基礎_類加載器

JAVA基礎_類加載器

內部類 ror 遇到 大致 otf win class pla nal

什麽是類加載器

  • 類加載器是Java語言在1.0版本就引入的。最初是為了滿足JavaApplet需要。現在類加載器在Web容器和OSGI中得到了廣泛的應用,一般來說,Java應用的開發人員不需要直接同類加載器進行交互。Java虛擬機默認的行為就已經足夠滿足大多數情況的需求了。不過如果遇到了需要與類加載器進行交互的情況,而對類加載器的機制又不是很了解的話,就很容易花大量的時候在ClassNotFoundException和NoClassDefFoundError等異常上。
  • 顧名思義,類加載器是用來加載Java類到Java虛擬機中。一般來說,Java虛擬機使用Java類的方式如下:Java源程序(.java文件)在經過Java編譯器編譯之後會被轉換成Java字節碼代碼(.class文件)。類加載器負責讀取Java字節代碼,並轉換成java.lang.Class類的一個實例。每個這樣的實例用來表示一個Java類。通過此實例的newInstance()方法就可以創建出該類的一個對象。實際的情況可能更復雜,比如Java字節碼可能是通過工具動態生成的,也可能是通過網絡下載的。基本上所有的類加載器都是java.lang.ClassLoader類的一個實例。

ClassLoader類介紹

java.lang.ClassLoader類的基本職責就是根據一個指定的類的名稱,找到或者生成其對應的字節代碼,然後從這些字節代碼中定義出一個Java類,即Java.lang.Class類的一個實例,除此之外,ClassLoader還負責加載Java應用所需要的資源,如圖像文件和配置文件。為了完成加載類這個職責,ClassLoader提供了一系列的方法。

表1:ClassLoader中與加載類相關的方法

方法 說明
getParent() 返回該類的父類加載器
loadClass(String name) 加載名稱為name的類,返回的結果是java.lang.Class類的實例
findClass(String name)查找名稱為name的類,返回的結果是java.lang.Class類的實例
findLoadedClass(String name) 查找名稱為name的已經被加載過的類,返回的結果是java.lang.Class的實例
defineClass(String name,byte[] b,int off,int len)把字節數組b中的內容轉換成java類,返回的結果是java.lang.Class的實例。這個方法被聲明為final的
resolveClass(Class<?> c)鏈接制定的Java類

在表1中給出的方法,表示類名稱的name參數的值是類的二進制名稱。需要註意的是內部類的表示,如:com.exampe.Husband$Wife和com.example.OutClass$InnerClass等表示形式。

類加載器的樹狀組織結構

Java中的類加載器大致可以分為兩類,一類是系統提供的,另外一類是Java應用開發人員自己編寫的。系統提供的主要有以下三種:

  • 引導類加載器(bootstrap class loader):它用來加載Java的核心庫,是用原生代碼來實現的,並不集成自java.lang.ClassLoader。
  • 擴展類加載器(extensions class loader):它用來加載Java的擴展庫。Java虛擬機的實現會提供一個擴展庫目錄。該類加載器在此目錄裏面查找並加載Java類。
  • 系統類加載器(system class loader):他根據Java應用的類路徑(CLASSPATH)來加載Java類。一般來說,Java應用的類都是由它來完成加載的。可以通過ClassLoader.getSystemClassLoader();來獲取它。

除了系統提供的類加載器以外,開發人員可以通過繼承 java.lang.ClassLoader類的方式實現自己的類加載器,以滿足一些特殊的需求。

圖1.類加載器樹狀結構示意圖

技術分享

太累了。。。明天寫

JAVA基礎_類加載器