Java語言是一種先天具備動態性的語言,之所以具備動態性正是因為Java類裝載器的存在。這會給我們開發帶來革命性的變革,因為我們有可能開發出有彈性、易擴充的程式。從而大大增強我們程式的可維護性。按載入條件分為預先載入與按需載入。
1.通常基礎類庫需要預先載入。(常駐記憶體)
2.自訂類庫需要按需載入。(使用時載入,使用完畢時由垃圾收集器負責釋放)
類裝載器運行模式分為兩種,如:
1.使用new關鍵字來隱式載入,首先來看一個例子:直接上代碼,很簡單的三個類。
public class A {public void print() {System.out.println("Using class A");}}
public class B {public void print() {System.out.println("Using class B");}}
public class Main {public static void main(String[] args) {A a = new A();a.print();B b = new B();b.print();}}
運行結果如下:
但是我們如果需要看類載入的詳細內容,我們就要用到這條命令:java -verbose:class Main
看看是不是首先載入的Java的基礎類庫,看最後幾行,首先載入Main,接下來執行個體化A類的時候會載入A,調用a.print()的時候列印了Using class A,然後載入B類,執行B中的方法。
2.使用Class.forName()方法載入類,這個做過J2EE開發的應該知道,在資料庫連接載入驅動的時候都可以這麼載入。還是看一個簡單的例子:
public interface Office {void start();}
public class Word implements Office {public void start() {System.out.println("Word start");}}
public class Excel implements Office {public void start() {System.out.println("Excel start");}}
public class Main {public static void main(String[] args) throws Exception{Class c = Class.forName(args[0]);Object o = c.newInstance();Office office = (Office) o;office.start();}}
繼續看一下載入的詳細內容:
詳細觀察一下最後幾行載入的順序,看看是否跟我們程式執行的是一樣的呢?
此處有一個結論:Java類裝載器會按照繼承體系從上至下的依次載入類,直到所有的祖先類都載入(上例中是介面),才輪到自己;相反,在Java類對象執行個體被收集釋放時,順序與載入相反。由此,我們也能看出,Java類的繼承體系不宜過長,因為那樣會使類的載入與釋放的效能受到影響。
3.直接使用類裝載器ClassLoader,例子是上一個例子的改版,只是修改了Main.java,其他三個類不變。
public class Main {public static void main(String[] args) throws Exception {System.out.println("begin load");// Main main = new Main();// ClassLoader loader = main.getClass().getClassLoader();ClassLoader loader = Main.class.getClassLoader();Class c = loader.loadClass(args[0]);System.out.println("begin init");Object o = c.newInstance();Office office = (Office) o;office.start();}}
首先獲得ClassLoader的執行個體,有兩種方法,上面注釋的為一種,放開的為另一種。然後調用loadClass()方法。運行一下,看下效果:
怎麼樣,Java語言夠動態吧。
轉載來源www.boobooke.com/bbs->J2EE專區->藍山作品—Java背後的秘密(匯總)