Java反射專題學習-動態類的載入
阿新 • • 發佈:2019-01-04
今天博主繼續學習基礎系列之反射專題;今天學習的內容是動態類的載入,我們以舉簡單的例子來進行一步步說明:
首先我們看一個例子: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動態載入類,還有介面進行強制轉換的小技巧,大家一起加油!