Java反射 —— 動態加載類

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這個類永遠都不須要修改,這就是動態加載類。

通常來講功能性的類,咱們都會使用動態加載類,而不使用靜態加載類。

相關文章
相關標籤/搜索