class.forName("類的全稱");java
編寫一個Office.java以下:命令行
class Office { public static void main(String[] args) { if ("Word".equals(args[0])) { Word w = new Word(); w.start(); } if ("Excel".equals(args[0])) { Excel e = new Excel(); e.start(); } } }
而後用命令行去編譯該文件,會報錯:code
由於Word類,Excel類都不存在。對象
如今把Word類補全,並編譯經過:blog
class Word { public static void start() { System.out.println("word...start..."); } }
此時再去編譯Office.java,就只會提示Excel類找不到:接口
經過new建立對象,是靜態加載類,在編譯時刻就要去加載全部可能使用到的類,無論某些類是否真的須要用到。io
如今咱們只想用Word,但程序一直在報錯:Excel這個類找不到。實際應用當中,咱們但願Word存在,Word就能用,當要使用Excel的時候,再提示咱們Excel找不到。這個程序就沒辦法作到,若是未來有許多功能,只要有一個功能有問題,其餘全部功能就都沒法使用,這就是編譯時刻加載致使的。編譯
咱們如今想要作到用哪一個類就加載哪一個類,不用就不加載。經過動態加載類就能夠解決該問題。class
建立一個OfficeBetter.java,以下:程序
class OfficeBetter { public static void main(String[] args) { try { //動態加載類,在運行時刻加載 Class c = Class.forName(args[0]); } catch (Exception e) { e.printStackTrace(); } } }
此時編譯該類不會報任何錯。傳入Word參數運行也不會報錯:
只有當咱們傳入不存在的類時,運行纔會報錯(但編譯不會保存):
接下來,咱們能夠經過類類型去建立對象,那麼問題就來了:
class OfficeBetter { public static void main(String[] args) { try { //動態加載類,在運行時刻加載 Class c = Class.forName(args[0]); //經過類類型,建立該類的對象 //Word w = (Word) c.newInstance(); //Excel e = (Excel) c.newInstance(); } catch (Exception e) { e.printStackTrace(); } } }
咱們這裏是該建立Word對象呢,仍是該建立Excel對象呢,或者咱們傳入的是其餘對象又該怎麼辦呢?
若是咱們想適應以後傳入的全部對象,咱們就須要提供一個統一的標準,建立接口類OfficeAble.java,以下:
interface OfficeAble { public void start(); }
而後讓咱們的類遵循該標準:
class Word implements OfficeAble { public void start() { System.out.println("word...start..."); } }
這樣咱們就能夠經過這個標準,建立全部實現了該接口的對象:
class OfficeBetter { public static void main(String[] args) { try { //動態加載類,在運行時刻加載 Class c = Class.forName(args[0]); //經過類類型,建立該類的對象 //Word w = (Word) c.newInstance(); //Excel e = (Excel) c.newInstance(); //經過標準接口建立對象 OfficeAble oa = (OfficeAble) c.newInstance(); //調用對象方法 oa.start(); } catch (Exception e) { e.printStackTrace(); } } }
此時從新編譯上面的文件,運行Word,就不會報錯:
若是想讓Excel也可使用,只需讓其實現OfficeAble接口就能夠(不須要從新編譯OfficeBetter.java),一樣的,未來添加了更多新的實現,都只要遵循該標準添加新的類,OfficeBetter這個類永遠都不須要修改,這就是動態加載類。
通常來講功能性的類,咱們都會使用動態加載類,而不使用靜態加載類。