1. 程式人生 > >Java反射專題學習-動態類的載入

Java反射專題學習-動態類的載入

 今天博主繼續學習基礎系列之反射專題;今天學習的內容是動態類的載入,我們以舉簡單的例子來進行一步步說明:

 首先我們看一個例子:OfficeTest.java

/**
 * @Description 測試類
 * @Date 2019/1/3 14:22
 * @Created by FLXH
 */
public class OfficeTest {

    public static void main(String[] args) {
        //new方法建立物件,在編譯時刻就需要載入所有可能使用到的類
        if ("Word".equals(args[0])) {
            Word w = new Word();
            w.start();
        }
        if ("Excel".equals(args[0])) {
            Excel e = new Excel();
            e.start();
        }
    }

}

當我們缺少Word和Excle任何一個類的時候,程式碼都無法編譯成功,從上面程式碼我們可以知道new方法建立物件,在編譯時刻就需要載入所有可能使用到的類,假如new了100個類,有一個類沒有,則其他99類就算都正常,這個測試類也無法通過編譯,這就說明了一點:

new方法建立物件:屬於靜態載入類

由此我們引申出動態載入類:我們來看下面這個例子:

首先我們列舉幾個用到的類:

1.一個介面:裡面包含一個start抽象方法

/**
 * @Description 公有類
 * @Date 2019/1/3 14:12
 * @Created by FLXH
 */
public interface ClassOffice {
    //抽象方法
    public void start();
}

2.Word類:需要實現ClassOffice介面

/**
 * @Description 公有類
 * @Date 2019/1/3 14:12
 * @Created by FLXH
 */
public interface ClassOffice {
    //抽象方法
    public void start();
}

3.Excel類:需要實現ClassOffice介面

/**
 * @Description Excel類
 * @Date 2019/1/3 14:13
 * @Created by FLXH
 */
public class Excel implements ClassOffice {

    @Override
    public void start() {
        System.out.println("Excel ... Start");
    }
}

4.再看一段動態測試類的程式碼:

/**
 * @Description 動態測試
 * @Date 2019/1/3 14:48
 * @Created by FLXH
 */
public class DynamicTest {

    public static void main(String[] args) {
        try {
            //動態載入類
            Class c = Class.forName(args[0]);
            //使用介面來接收動態傳入的類 這些類需要實現這個介面
            ClassOffice co = (ClassOffice) c.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        }
    }
}

 根據上面的程式碼可以知道,當我們通過Class.forName這樣的方式去載入類的時候,是可以通過編譯的,具體的類可以通過args[0]傳入進來,這就和直接去new建立類有區別了,一個靜態的,而另一個是動態的;

這裡又衍生出一個問題,由於在編譯的時候我不知道傳那個類,所以在通過"類型別"(Class Type:上一篇部落格有講)的newInstance方法建立物件時,這樣在強制轉換的時候有可能出錯,比如:從這個例子來說,你強制轉換成Word類,那麼有可能傳進的是Excel類,就會發生轉換型別的錯誤;所以我們聲明瞭一個ClassOffice介面,其他兩個類實現這個介面,即可把型別轉換成ClassOffice,這樣傳Word或者Excel就都沒有問題了

5.好了,總結一下,主要注意下new建立靜態載入類和Class.forName動態載入類,還有介面進行強制轉換的小技巧,大家一起加油!