Java動態載入類

言曌發表於2018-03-03

一、Class 類

Class.forName("類的全稱")

  • 不僅表示類的類型別,還代表了動態載入類
  • 請大家區分編譯、執行
  • 編譯時刻載入類是靜態載入類、執行時刻載入類是動態載入類

 

 

二、靜態載入類

1、我們看下面這段程式碼,通過 new 的方式來建立物件,這其實是靜態方式來載入類(Word和Excel)

  1. public class Office {
  2.     public static void main(String args[]) {
  3.         if("Word".equals(args[0])) {
  4.             Word w = new Word();
  5.             w.start();
  6.         }
  7.         if("Excel".equals(args[0])) {
  8.             Excel e = new Excel();
  9.             e.start();
  10.         }
  11.     }
  12. }

如上程式碼,目前是沒有 Word 和 Excel 兩個類,我們編譯程式

結果如下

Java動態載入類

可見,因為我們沒有 Word 和 Excel 類,自然也沒有 start 方法,報了四個錯誤。

 

2、我們建立 一個 Word 類

  1. public class Office {
  2.     public static void main(String args[]) {
  3.         if("Word".equals(args[0])) {
  4.             Word w = new Word();
  5.             w.start();
  6.         }
  7.         if("Excel".equals(args[0])) {
  8.             Excel e = new Excel();
  9.             e.start();
  10.         }
  11.     }
  12. }
  13. class Word {
  14.     public void start() {
  15.         System.out.println("start word...");
  16.     }
  17. }

再次編譯,結果如下

Java動態載入類

這次只報了兩個錯誤了,顯示 Excel 類和其物件的 start() 方法不存在

 

3、結論

使用 new 建立物件的方式,是靜態載入類,編譯階段,就會載入可能要用到類,如果不存在就報錯,無法通過編譯。

如上,第2中的例子,Word 類存在,Excel 不存在,導致 Word 類也用不了。

我們當然希望,Word 類存在 Word 就能用,用 Excel 的時候發現 Excel 類不存在再報錯吧。

如果將來我們有100個功能,有一個功能有問題,其他99個也用不了,十分不好。

這就是編譯時載入導致的,靜態載入類。

我們希望,用的時候再載入類,不用不載入,動態載入類可以實現。

 

三、使用動態載入的方式

1、 OfficeAble.java  定義規範的介面

  1. public interface OfficeAble {
  2.     void start();
  3. }

2、Word.java  實現 OfficeAble 介面

  1. public class Word implements OfficeAble {
  2.     public void start() {
  3.         System.out.println("start word...");
  4.     }
  5. }

3、Excel.java   實現 OfficeAble 介面

  1. public class Excel implements OfficeAble {
  2.     @Override
  3.     public void start() {
  4.         System.out.println("start excel...");
  5.     }
  6. }

4、OfficeBetter.java

  1. public class OfficeBetter {
  2.     public static void main(String args[]) {
  3.         try {
  4.             //動態載入類,在執行的時候載入類
  5.             Class c = Class.forName(args[0]);
  6.             //通過類型別
  7.             OfficeAble oa = (OfficeAble) c.newInstance();
  8.             oa.start();
  9.         } catch (ClassNotFoundException e) {
  10.             e.printStackTrace();
  11.         } catch (IllegalAccessException e) {
  12.             e.printStackTrace();
  13.         } catch (InstantiationException e) {
  14.             e.printStackTrace();
  15.         }
  16.     }
  17. }

 

然後我們在終端依次編譯 Word類,Excel 類,OfficeBetter類

再執行 Office類,帶 Word 引數

再執行 OfficeBtter類,帶 Excel 引數

Java動態載入類

同時,已經編譯的,生成了.class 檔案,下次就可以直接執行了,而不需要重新編譯,這就是所謂的“一次編譯,到處執行”。

一般情況,軟體升級也是如此,只需要編譯需要新的功能,而之前的功能也可以正常使用。

相關文章