- Java反射是Java被視為動態(或准動態)語言的一個關鍵性質。這個機制允許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public, static 等)、superclass(例如Object)、實現之interfaces(例如Cloneable),也包括fields和methods的所有信息,並可於運行時改變fields內容或喚起methods。
- Java反射機制容許程序在運行時加載、探知、使用編譯期間完全未知的classes。通過JAVA的反射機制,可以獲得程序內部或第三方JAR包的CLASS,METHOD,屬性,參數等信息。
- 這篇文章主要講動態加載讓程序實現動態加載。
- 讓程序實現動態加載是實現開發中必須用的。
- 動態加載:程序在運行時調用相應方法,即使其他方法是錯誤的,程序依舊會執行。通過動態加載可以讓程序的可延長性大大提升,對以后的維護和擴展有重要意義。
- 靜態加載:程序在編譯時執行。在執行過程中加載所有可能執行到的程序。在這種加載方式下,只要加載中一個方法出錯,程序就不能運行。我們一般寫程序默認的是靜態加載。
- 下面我們通過一個案例來分析一下:
- 在office程序中,有Word和Excel兩個功能。
public class MainLoad { public static void main(String[] args) { //靜態加載。編譯時加載,編譯時就需要加載全部可能使用到的的類,一個類出錯,其他類的功能都不能得到執行 if("Word".equals(args[0])){ Word Word = new Word(); System.out.println("Word"); } if("Excel".equals(args[0])){ Excel excel = new Excel(); System.out.println("Excel"); } } }
public class MainLoad {- public static void main(String[] args) {
- //靜態加載。編譯時加載,編譯時就需要加載全部可能使用到的的類,一個類出錯,其他類的功能都不能得到執行
- if("Word".equals(args[0])){
- Word Word = new Word();
- System.out.println("Word");
- }
- if("Excel".equals(args[0])){
- Excel excel = new Excel();
- System.out.println("Excel");
- }
- }
- }
- 現在我們完善Word功能新建一個class,類名為Word,代碼如下
- public class Word implements RunBetter{
- @Override
- public void startPro() {
- // TODO Auto-generated method stub
- System.out.println("Word Test!");
- }
- }
- 這個代碼直接在電腦上運行會報編譯異常,因為我們並沒有建Excel類。
- 即使我們直接用控制台java MainLoad.java執行,也會在new Excel();時報錯。
- 那么,如果用戶只想用Word,並不想使用Excel功能呢。這就強迫我們必須實現Excel的功能,我們的程序才可以運行。
- 這個時候,就可以用動態加載僅僅調用MainLoad中的Word功能
- 新建一個接口,
- public interface RunBetter {
- public void startPro();
- }
- 新建一個程序入口。
- public static void main(String[] args) {
- try {
- //運行時加載,動態加載類
- Class c1 = Class.forName(args[1]);
- //通過類類型加載對象。
- //返回的是包含N個class的接口,以免程序編譯錯亂
- RunBetter rb = (RunBetter)c1.newInstance();
- rb.startPro();
- }
- 在這個代碼中我們通過獲得類類型newInstance。然后再執行startPro中的方法。
- 為什么不將
- RunBetter rb = (RunBetter)c1.newInstance();
- 寫成
- MainLoad rb = (MainLoad)c1.newInstance(); ???
- 因為MianLoad中我們有多個方法,如果直接用這個類強轉,那程序可能隨機調用這個類中的某一個方法。所以我們需要新建一個接口。
- 當程序擴展的時候,直接在接口增加功能模塊,就像我們升級手機上的程序不需要下載完整的安裝包一樣,這個時候直接添加功能模塊就可以,不用在編譯了。
- 程序源碼:http://download.csdn.net/detail/jacxuan/9714217
