1. 程式人生 > >java反射學習筆記(2)----java中的靜態載入類和動態載入類

java反射學習筆記(2)----java中的靜態載入類和動態載入類

  首先我們要了解java中的編譯和執行的兩個概念,我們在初學java的時候都學過,我們會先寫一個Test.java檔案,然後javac Test.java,最後在java Test 。這其中的javac就是在編譯這個.java檔案,java命令就是在執行編譯後的檔案。

1、靜態載入類

瞭解了編譯和執行的連個概念後,我們就可以去學習靜態和動態載入類了,其中,靜態載入類就是使用new運算子去建立一個物件,在編譯的時候去進行載入,這就是類的靜態載入,編譯的時候,會載入java檔案中所有的類。這個時候如果其他的類有問題,那麼沒有問題的累也不回去執行。我們用一段程式碼來進行說明:
public
class Test{ public static void main(String []args){ if(arg[0].equals("A")){ A a = new A(); a.print_info(); }else if(arg[0].equals("B")){ B b = new B(); b.print_info(); } } } class A{ public void print_info(){ System.out
.println("i am a..."); } } class B{ public void print_info(){ System.out.println("i am b..."); } }
上述程式碼中,如果我們在編譯的時候,沒有建立A類或者B類,就會報錯。那麼我們在實際的開發過程中,如果只想使用java Test A來呼叫A的功能,但是在判斷的時候又不能將B的這種情況給省略掉,那麼我們就不能用這種靜態載入的方法了。我們要是用動態載入類方式來載入Test類。

2、動態載入類

使用動態載入類,在編譯的時候不會因為上述問題而報錯,只有在執行的時候,才會去報相應的錯誤,我們通過程式碼來演示:
public class Test{
    public static void main(String []args){
        Class c = Class.forName(args[0]);//動態載入類,在執行的時刻載入
        Able ab = (Able)c.newInstance();//通過c(class type)來建立例項化物件,不過這個例項化物件,是我們通過args[0]讀進來的引數類的物件,不是這裡的Able。
        c.print_Info();     
    }
}
interface Able{
    public void print_Info();
}

class A implements Able{
    public void print_info(){
        System.out.println("i am a...");
    }
}

class B implements Able{
    public void print_info(){
        System.out.println("i am b...");
    }
}
我們在上述的動態載入的方法中,在main方法中,通過Class來讀取引數中的類的class type,然後再通過newInstance()方法來建立該類的物件,然後用介面的引用來指向這個物件,進而實現相應的具體的方法實現,而不會出現我們之前靜態載入時與到的問題。