java反射:動態載入類
阿新 • • 發佈:2019-01-06
我們在程式設計時也許會遇到這樣的問題,當我們在定義兩個類物件時,如果其中一個類不存在,或者類的方法找不到,那麼即使另外一個類以及其類方法是存在並且正確的,我們在執行時也會報錯,如以下這個問題:
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");
}
}
通過一個統一的介面,使得動態載入類時更為靈活,擴充套件功能時只要新增相應功能的類實現統一的介面即可
功能性的類儘可能進行動態載入