在講解動(dòng)態(tài)加載類之前呢,我們先弄清楚為什么要?jiǎng)討B(tài)加載類,靜態(tài)加載不行嗎?我們可以看下面的實(shí)例:
我在文件夾里寫了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");
- }
- }
此時(shí)我們編譯一下Office.java 文件:
編譯會(huì)報(bào)錯(cuò),這當(dāng)然沒問題,因?yàn)榇_實(shí)沒有寫Excel.java類。
但是這個(gè)Excel類我們一定會(huì)用到嗎?如果這個(gè)Excel類需要很久才能寫出來,在此我們也不能使用其他功能嗎?后面如果一個(gè)類出問題了,這個(gè)系統(tǒng)是不是就癱瘓了?
所以這就體現(xiàn)出動(dòng)態(tài)加載類的好處了,動(dòng)態(tài)加載類是按需加載的,你需要什么類,就加載什么類,一個(gè)類的狀態(tài),不會(huì)影響到另一個(gè)類的使用。
所以我們可以將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類,但此時(shí)我們?cè)倬幾gOffice.java文件,編譯通過;
運(yùn)行一下:
成功按照我們預(yù)想的結(jié)果運(yùn)行,這樣Word類就可以單獨(dú)運(yùn)行。
但是這樣還是不夠規(guī)范,因?yàn)楝F(xiàn)在只能加載Word類類型的類文件,為了使程序有更好的擴(kuò)展性,我們添加一個(gè)接口,只有讓所有的功能類實(shí)現(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");
- }
- }
這樣改造之后,我后面要添加一個(gè)Excel類,乃至添加其他的類,只需要實(shí)現(xiàn)OfficeAble接口就可以了,不需要改動(dòng)Office這個(gè)類和其他的功能類,擴(kuò)展性很強(qiáng),這就是動(dòng)態(tài)加載的優(yōu)勢(shì)。
總結(jié)
到此這篇關(guān)于Java動(dòng)態(tài)加載類的文章就介紹到這了,更多相關(guān)Java動(dòng)態(tài)加載類內(nèi)容請(qǐng)搜索我們以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持我們!
原文鏈接:https://blog.csdn.net/zai_xia/article/details/80026325