1. 程式人生 > >java反射:動態載入類

java反射:動態載入類

    我們在程式設計時也許會遇到這樣的問題,當我們在定義兩個類物件時,如果其中一個類不存在,或者類的方法找不到,那麼即使另外一個類以及其類方法是存在並且正確的,我們在執行時也會報錯,如以下這個問題:

        if("Word".equals(args[0])) {
            Word word=new Word();
            word.start();
        }
        if("Excel".equals(args[0])) {
            Excel excel=new Excel();
            excel.start();
    }

    執行結果顯示,Word和Excel類不存在,並且start()方法找不到,這時我們進行如下操作:

class Word{
public void start() {
    System.out.println("Word Start");
}
}

    建立Word類和Word類中的start()方法之後,再次執行該程式,此時仍然會報出兩個錯誤:Excel類以及Excel類中的start()方法不存在
    這是因為用new建立物件,是靜態載入類,在編譯時刻就要載入所有可能存在的類
    但如果我們只用Word類,不使用Excel類,這種靜態載入類就不能滿足我們的要求。假設如果有一百個類,而只有一個類不能通過編譯,則其他所有的類都不能使用,這不是我們所希望看到的。
    這要求類在執行時動態載入,需要用到哪個類,就載入哪個類,其他類的情況不會影響到這個類

class dynamicBetter{
    public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class c=Class.forName(args[0]);
        Word w=(Word)c.newInstance();//通過類型別建立該類的物件
}

    如上,我們通過該類的類型別來建立某一個類的物件,此時實現了動態載入類,在編譯過程中不會報出任何錯誤
    此時我們在動態載入Word時可以得到執行結果,那麼如果動態載入的是Excel類呢?為了保證統一性,可以進行如下操作:

public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class c=Class.forName(args[0]);
        //Word w=(Word)c.newInstance();//通過類型別建立該類的物件,要想讓Word和Excel都可以用,要進行統一
       OfficeAble oa=(OfficeAble)c.newInstance();       
        oa.start();
    }
    interface OfficeAble{
    public void start();
}
class Word implements OfficeAble{//實現統一介面
public void start() {
    System.out.println("Word Start");
}
}

    通過一個統一的介面,使得動態載入類時更為靈活,擴充套件功能時只要新增相應功能的類實現統一的介面即可
    功能性的類儘可能進行動態載入