URLClassLoader

URLClassLoader

URLClassLoader

Java 原生JDK裡面為ClassLoader提供了一個URLClassLoader實現類,通過UML圖我們可以看出,它是ExtClassLoader和 AppClassLoader的父類,它功能強大,它既可以從本地檔案系統來獲取二進位制檔案去載入,也可以從遠端主機 獲取二進位制檔案去載入。

 

該類載入器用於指向JAR檔案和目錄的URL 的搜尋路徑載入類和資源。這裡假定任何以  / 結束的URL都是指向該目錄的,如果不是以該字元結束的,則會認為指向一個根據需要開啟的JAR檔案

構造方法摘要
URLClassLoader(URL[] urls) 
          使用預設的委託父 ClassLoader 為指定的 URL 構造一個新 URLClassLoader。
URLClassLoader(URL[] urls, ClassLoader parent) 
          為給定的 URL 構造新 URLClassLoader。
URLClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) 
          為指定的 URL、父類載入器和 URLStreamHandlerFactory 建立新 URLClassLoader。

 

方法摘要
protected  void    addURL(URL url) 
          將指定的 URL 新增到 URL 列表中,以便搜尋類和資源。
protected  Package    definePackage(String name, Manifest man, URL url) 
          用該 ClassLoader 中的名稱定義一個新包。
protected  Class<?>    findClass(String name) 
          通過 URL 搜尋路徑查詢並載入具有指定名稱的類。
 URL    findResource(String name) 
          在 URL 搜尋路徑中查詢具有指定名稱的資源。
 Enumeration<URL>    findResources(String name) 
          返回表示 URL 搜尋路徑中具有指定名稱的所有資源的 URL 列舉。
protected  PermissionCollection    getPermissions(CodeSource codesource) 
          返回給定 codesource 物件的許可權。
 URL[]    getURLs() 
          返回用於載入類和資源的 URL 搜尋路徑。
static URLClassLoader    newInstance(URL[] urls) 
          為 指定的 URL 和預設的父類載入器建立新 URLClassLoader 例項。
static URLClassLoader    newInstance(URL[] urls, ClassLoader parent) 
           為指定的 URL 和父類載入器建立新 URLClassLoader 例項。

 

從類 java.security.SecureClassLoader 繼承的方法
defineClass, defineClass

 

構造方法詳細資訊

URLClassLoader  public URLClassLoader(URL[] urls, ClassLoader parent)

為給定的 URL 構造新 URLClassLoader。首先在指定的父類載入器中搜尋 URL,然後按照為類和資源指定的順序搜尋 URL。這裡假定任何以  /  結束的 URL 都是指向目錄的。如果不是以該字元結束,則認為該 URL 指向一個將根據需要下載和開啟的 JAR 檔案。
如果有安全管理器,該方法首先呼叫安全管理器的 checkCreateClassLoader 方法以確保允許建立類載入器。

引數:
urls – 從其位置載入類和資源的 UR
parent – 用於委託的父類載入器
丟擲:
SecurityException – 如果存在安全管理器,且其 checkCreateClassLoader 方法不允許建立類載入器。
另請參見:
SecurityManager.checkCreateClassLoader()

public URLClassLoader(URL[] urls)

使用預設的委託父 ClassLoader 為指定的 URL 構造一個新 URLClassLoader。首先在父類載入器中搜尋 URL,然後按照為類和資源指定的順序搜尋 URL。這裡假定任何以 / 結束的 URL 都是指向目錄的。如果不是以該字元結束,則認為該 URL 指向一個將根據需要下載和開啟的 JAR 檔案。
如果有安全管理器,該方法首先呼叫安全管理器的 checkCreateClassLoader 方法以確保允許建立類載入器。

引數:
urls – 從其位置載入類和資源的 URL
丟擲:
SecurityException – 如果安全管理器存在並且其 checkCreateClassLoader 方法不允許建立類載入器。
另請參見:
SecurityManager.checkCreateClassLoader()

public URLClassLoader(URL[] urls,  ClassLoader parent, URLStreamHandlerFactory factory)

為指定的 URL、父類載入器和 URLStreamHandlerFactory 建立新 URLClassLoader。該父引數將充當委託的父類載入器。該工廠引數將充當建立新 jar URL 時獲取協議處理程式的流處理程式工廠。
如果有安全管理器,該方法首先呼叫安全管理器的 checkCreateClassLoader 方法以確保允許建立類載入器。

引數:
urls – 從其位置載入類和資源的 URL
parent – 用於委託的父類載入器
factory – 建立 URL 時使用的 URLStreamHandlerFactory
丟擲:
SecurityException – 如果安全管理器存在並且其 checkCreateClassLoader 方法不允許建立類載入器。
另請參見:
SecurityManager.checkCreateClassLoader()

 

 

方法詳細資訊

addURL

protected void addURL(URL url)
將指定的 URL 新增到 URL 列表中,以便搜尋類和資源。
引數:
url – 將新增到 URL 搜尋路徑中的 URL

getURLs

public URL[] getURLs()
返回用於載入類和資源的 URL 搜尋路徑。這包括為構造方法指定的原始 URL 列表,以及由 addURL() 方法後續新增的 URL。
返回:
用於載入類和資源的 URL 搜尋路徑。

findClass

protected Class<?> findClass(String name)  throws ClassNotFoundException
通過 URL 搜尋路徑查詢並載入具有指定名稱的類。只有在找到該類後,才能根據需要載入和開啟任何指向 JAR 檔案的 URL。
覆蓋:
類 ClassLoader 中的 findClass
引數:
name – 類的名稱
返回:
結果類
丟擲:
ClassNotFoundException – 如果無法找到該類

definePackage

protected Package definePackage(String name, Manifest man,  URL url)
                         throws IllegalArgumentException
用該 ClassLoader 中的名稱定義一個新包。該指定的 Manifest 中包含的屬性將用於包含包版本和密封資訊。對於密封的包,此附加 URL 從載入該包的 URL 指定程式碼源 URL。
引數:
name – 包的名稱
man – 包含包的版本和密封資訊的 Manifest
url – 包的程式碼源 url,或者如果沒有,則為 null
返回:
新定義的 Package 物件
丟擲:
IllegalArgumentException – 如果包的名稱與該類載入器或其祖先之一中現有的包重名

findResource

public URL findResource(String name)
在 URL 搜尋路徑中查詢具有指定名稱的資源。
覆蓋:
類 ClassLoader 中的 findResource
引數:
name – 資源的名稱
返回:
資源的 URL,或者如果無法找到該資源,則返回 null。

findResources

public Enumeration<URL> findResources(String name)
                               throws IOException
返回表示 URL 搜尋路徑中具有指定名稱的所有資源的 URL 列舉。
覆蓋:
類 ClassLoader 中的 findResources
引數:
name – 資源名稱
返回:
URL 的列舉
丟擲:
IOException – 如果發生 I/O 異常

getPermissions

protected PermissionCollection getPermissions(CodeSource codesource)
返回給定 codesource 物件的許可權。該方法的實現首先呼叫 super.getPermissions,然後基於 codesource 的 URL 新增許可權。
如果此 URL 的協議為 “jar”,那麼授予的許可權將基於 Jar 檔案 URL 所請求的許可權。

如果協議為 “file”,並且路徑指定了某個檔案,則要授予對該檔案的讀許可權。如果協議為 “file”,並且路徑是一個目錄,則要授予該目錄中的所有檔案及其(遞迴)子目錄中包含的所有檔案讀許可權。

如果協議不是 “file”,則允許連線到和接收來自 URL 主機的連線。

覆蓋:
類 SecureClassLoader 中的 getPermissions
引數:
codesource – codesource
返回:
授予 codesource 的許可權

newInstance

public static URLClassLoader newInstance(URL[] urls, ClassLoader parent)
為指定的 URL 和父類載入器建立新 URLClassLoader 例項。如果安裝了安全管理器,該方法返回的 URLClassLoader 的 loadClass 方法將在載入該類之前呼叫 SecurityManager.checkPackageAccess 方法。
引數:
urls – 用於搜尋類和資源的 URL
parent – 用於委託的父類載入器
返回:
結果類載入器

newInstance

public static URLClassLoader newInstance(URL[] urls)
為指定的 URL 和預設的父類載入器建立新 URLClassLoader 例項。如果安裝了安全管理器,該方法返回的 URLClassLoader 的 loadClass 方法將在載入該類之前呼叫 SecurityManager.checkPackageAccess。
引數:
urls – 用於搜尋類和資源的 URL
返回:
結果類載入器

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


(adsbygoogle = window.adsbygoogle || []).push({});

function googleAdJSAtOnload() {
var element = document.createElement(“script”);
element.src = “//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”;
element.async = true;
document.body.appendChild(element);
}
if (window.addEventListener) {
window.addEventListener(“load”, googleAdJSAtOnload, false);
} else if (window.attachEvent) {
window.attachEvent(“onload”, googleAdJSAtOnload);
} else {
window.onload = googleAdJSAtOnload;
}