Java動態加載類示例詳解

在講解動態加載類之前呢,我們先弄清楚為什麼要動態加載類,靜態加載不行嗎?我們可以看下面的實例:

我在文件夾裡寫瞭Office.java 類和 Word.java類,如下:

Office.java

class Office{
	public static void main(String[] args){
		if(args[0].equals("Word")){
			Word w = new Word();
			w.start();
		}
		if(args[0].equals("Excel")){
			Excel e = new Excel();
			e.start();
		}
	}
}

Word.java

class Word{
	public void start(){
		System.out.println("Word Start");
	}
}

此時我們編譯一下Office.java 文件:

編譯會報錯,這當然沒問題,因為確實沒有寫Excel.java類。

但是這個Excel類我們一定會用到嗎?如果這個Excel類需要很久才能寫出來,在此我們也不能使用其他功能嗎?後面如果一個類出問題瞭,這個系統是不是就癱瘓瞭?

所以這就體現出動態加載類的好處瞭,動態加載類是按需加載的,你需要什麼類,就加載什麼類,一個類的狀態,不會影響到另一個類的使用。

所以我們可以將Office類改造如下:

class Office{
	public static void main(String[] args){
		try{
			Class c = Class.forName(args[0]);
			Word w = (Word)c.newInstance();
			w.start();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		
	}
}

雖然我們還是沒有寫Excel類,但此時我們再編譯Office.java文件,編譯通過;

運行一下:

成功按照我們預想的結果運行,這樣Word類就可以單獨運行。

但是這樣還是不夠規范,因為現在隻能加載Word類類型的類文件,為瞭使程序有更好的擴展性,我們添加一個接口,隻有讓所有的功能類實現該接口即可。完善如下:

OfficeAble.java

interface OfficeAble{
	public void start();
}

Office.java

class Office{
	public static void main(String[] args){
		try{
			Class c = Class.forName(args[0]);
			OfficeAble oa = (OfficeAble)c.newInstance();
			oa.start();
		}
		catch(Exception e){
			e.printStackTrace();
		}
		
	}
}

Word.java

class Word implements OfficeAble{
	public void start(){
		System.out.println("Word Start");
	}
}

這樣改造之後,我後面要添加一個Excel類,乃至添加其他的類,隻需要實現OfficeAble接口就可以瞭,不需要改動Office這個類和其他的功能類,擴展性很強,這就是動態加載的優勢。

總結

到此這篇關於Java動態加載類的文章就介紹到這瞭,更多相關Java動態加載類內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: