在講解動態(tài)加載類之前呢,我們先弄清楚為什么要動態(tài)加載類,靜態(tài)加載不行嗎?我們可以看下面的實例:
我在文件夾里寫了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類需要很久才能寫出來,在此我們也不能使用其他功能嗎?后面如果一個類出問題了,這個系統(tǒng)是不是就癱瘓了?
所以這就體現(xiàn)出動態(tài)加載類的好處了,動態(tài)加載類是按需加載的,你需要什么類,就加載什么類,一個類的狀態(tài),不會影響到另一個類的使用。
所以我們可以將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類就可以單獨運行。
但是這樣還是不夠規(guī)范,因為現(xiàn)在只能加載Word類類型的類文件,為了使程序有更好的擴展性,我們添加一個接口,只有讓所有的功能類實現(xiàn)該接口即可。完善如下:
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類,乃至添加其他的類,只需要實現(xiàn)OfficeAble接口就可以了,不需要改動Office這個類和其他的功能類,擴展性很強,這就是動態(tài)加載的優(yōu)勢。
總結
到此這篇關于Java動態(tài)加載類的文章就介紹到這了,更多相關Java動態(tài)加載類內(nèi)容請搜索我們以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持我們!
原文鏈接:https://blog.csdn.net/zai_xia/article/details/80026325