關于ClassLoader與動態擴展_第1頁
關于ClassLoader與動態擴展_第2頁
關于ClassLoader與動態擴展_第3頁
關于ClassLoader與動態擴展_第4頁
關于ClassLoader與動態擴展_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、關于 ClassLoader 與動態擴展我們要使用一個類,這個類首先要被裝載,然后進行連接,初始化等步驟。一 個類的裝載是由類裝載器 (ClassLoader完成 的。Java 中類裝載器大體分為兩種,一種是啟動類裝載器(Bootstrap ClassLoader ,這種類裝載器是 jvm 實現的一部分,它不是 ClassLoader 類的子類 ; 另 一種是用戶自定義的類裝載器,這類類裝載器都是 ClassLoader 類的子類, Java API中 提供了幾個自定義類裝載器的實現:ExtClassLoader 用來裝載標準擴展庫中的類, AppClassLoader 一般用來裝載我們定義的

2、類。這里簡單的說一下類裝載器的雙親委派模型。除了啟動類裝載器,每一個類裝載器都 有一個 parent , ExtClassLoader 的 parent 是 Bootstrap ClassLoader, AppClassLoader 的 parent 是 ExtClassLoader ,像我 們自定義的 ClassLoader ,如果不明確指定 parent, 其 parent 都 默認是 AppClassLoader 。可以通過調用 ClassLoader 實例的 getParent(方法來獲取其 parent , 如果其雙親 是 Bootstrap ClassLoader,這個方法將返回

3、null 。當一個類裝載器被 請求 裝載一個類型時,它首先請求其 parent 來裝載這個類型,其 parent 再向上請求直到 Bootstrap ClassLoader,如果其 parent 能夠裝載這個類開則返回代表這個類型的 Class 實例,如果不能此 ClassLoader嘗試裝載,如果成功返回代表這個類型的 Class 實例, 否則拋出異常。在 Java 術語中,要求某個類裝載器去裝載一個類型,但是卻返回了其他類裝載 器裝載的類型,這種裝載器被 稱為是那個類型的初始類裝載器,而實際定義那個類型 的類裝載器稱為該類型的定義類裝載器。下面我們通過一個簡的例子來看一下 我們平時定義的類

4、和 API 中的類都 是通 過哪些 ClassLoader 來裝載的。ClassLoaderDemo.javapackage kevin;public class ClassLoaderDemo public static void main(String args Class thisCls = ClassLoaderDemo.class ;System. out.println("the class loader of this class with main method is:"+ thisCls.getClassLoader(;Class sysCls = Sys

5、tem.class ;System. out .println("the loader of the System class is: "+ sysCls.getClassLoader(;Class listCls = List.class ;System. out.println("the loader of the List class in package java.util is:"+ listCls.getClassLoader(;/* 以上三句的打印結果如下:* the loader of the System class is: null*

6、 the loader of the List class in package java.util is:null* 由此可見我們自定義的類是默認是由 AppClassLoader 裝載的,而 API 中 的類是由 BootStrap* ClassLoader,即啟動類裝載 器裝載的*/Java 允許動態擴展程序,這個過程包括運行時決定所使用的類型,裝載它們, 使用它們。動態擴展一般可以通過兩種方法來實現,第一種是使用自定義的類裝載器 的 loadClass(方法,另一種就是使用 Class.forName(方法。下面我們首先通過自定義類裝載器的方法來動態擴展 java 程序。Hello.j

7、avapackage kevin;public class Hello public void sayHello(System. out .println("Hello,free world."HelloClassLoader.javapackage kevin;/* 自定義一個類裝載器*/public class HelloClassLoader extends ClassLoader /* 類所在的目錄路徑*/private String basePath ;public HelloClassLoader(String basePath this . basePath

8、= basePath;public HelloClassLoader(ClassLoader parent, String basePath super (parent;this . basePath = basePath;/* 一般我們要重寫這個方法,然后將代表這個 class 文件的 byte 數組數據傳遞給 defineClass 方法,它會將這個數組* 轉換在一個代表此類的 Class 實例返回*/Overrideprotected Class findClass(String name throws ClassNotFoundException / TODO Auto-generat

9、ed method stubif (data = null throw new ClassNotFoundException(;return defineClass(name, data, 0, data.length ;/* 獲取類文件的字節數據* param name 類的全限定名* return包含類數據的 byte 型數組*/public byte getClassData(String name String filePath = basePath + name.replace("." ,File. separator ;byte buf = null ;try

10、FileInputStream in = new FileInputStream(filePath; buf = new byte in.available(;in.read(buf; catch (FileNotFoundException e e.printStackTrace(; catch (IOException e / TODO Auto-generated catch blocke.printStackTrace(;return buf;CustomLoaderDemo.javapackage kevin;public class CustomLoaderDemo public

11、static void main(String args /創建自定義的 ClassLoader 的實例HelloClassLoader loader = new HelloClassLoader("" ;System. out .println(loader.getParent(;try /用自定義的類裝載器來裝載類 , 這是動態擴展的一種途徑Class cls = loader.loadClass("kevin.Hello" ;System. out .println(cls.getClassLoader(;Hello hello = (Hello

12、cls.newInstance(;hello.sayHello(; catch (ClassNotFoundException e e.printStackTrace(; catch (InstantiationException e e.printStackTrace(; catch (IllegalAccessException e e.printStackTrace(;雖然我們請求讓自定義的類裝載器 HelloClassLoader 來裝載 Hello.class ,但是該類 的定義類裝載器卻是 AppClassLoader ,這個可以通過上面說過的雙親委派模型來解釋。下面是一個 forName(的例子。使用 forName(可以保證在這個方法返回之前 ,被 裝載的類型會被連接和初始化,而 loadClass(不能對此做出承諾。EasyHello.javapackage kevin;public class EasyHello public static void main(String args / 動態擴展的另一種途徑是用 Class 類的靜態方法 forName(try Class cls = Class.forName ("kevin.Hello" ;Hello h

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論