JAVA反射機制--靜態加載與動態加載

  1. Java反射是Java被視爲動態(或準動態)語言的一個關鍵性質。這個機制容許程序在運行時透過Reflection APIs取得任何一個已知名稱的class的內部信息,包括其modifiers(諸如public, static 等)、superclass(例如Object)、實現之interfaces(例如Cloneable),也包括fields和methods的全部信息,並可於運行時改變fields內容或喚起methods。
  2. Java反射機制允許程序在運行時加載、探知、使用編譯期間徹底未知的classes。經過JAVA的反射機制,能夠得到程序內部或第三方JAR包的CLASS,METHOD,屬性,參數等信息。
  3. 這篇文章主要講動態加載讓程序實現動態加載。
  4. 讓程序實現動態加載是實現開發中必須用的。
  5. 動態加載:程序在運行時調用相應方法,即便其餘方法是錯誤的,程序依舊會執行。經過動態加載可讓程序的可延長性大大提高,對之後的維護和擴展有重要意義。
  6. 靜態加載:程序在編譯時執行。在執行過程當中加載全部可能執行到的程序。在這種加載方式下,只要加載中一個方法出錯,程序就不能運行。咱們通常寫程序默認的是靜態加載。
  7. 下面咱們經過一個案例來分析一下:
  8. 在office程序中,有Word和Excel兩個功能。
  9. 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 {
  10. public static void main(String[] args) {
  11. //靜態加載。編譯時加載,編譯時就須要加載所有可能使用到的的類,一個類出錯,其餘類的功能都不能獲得執行
  12. if("Word".equals(args[0])){
  13. Word Word = new Word();
  14. System.out.println("Word");
  15. }
  16. if("Excel".equals(args[0])){
  17. Excel excel = new Excel();
  18. System.out.println("Excel");
  19. }
  20. }
  21. }
  22. 如今咱們完善Word功能新建一個class,類名爲Word,代碼以下
  23. public class Word implements RunBetter{
  24. @Override
  25. public void startPro() {
  26. // TODO Auto-generated method stub
  27. System.out.println("Word Test!");
  28. }
  29. }
  30. 這個代碼直接在電腦上運行會報編譯異常,由於咱們並無建Excel類。
  31. 即便咱們直接用控制檯java MainLoad.java執行,也會在new Excel();時報錯。
  32. 那麼,若是用戶只想用Word,並不想使用Excel功能呢。這就強迫咱們必須實現Excel的功能,咱們的程序才能夠運行。
  33. 這個時候,就能夠用動態加載僅僅調用MainLoad中的Word功能
  34. 新建一個接口,
  35. public interface RunBetter {
  36. public void startPro();
  37. }
  38. 新建一個程序入口。
  39. public static void main(String[] args) {
  40. try {
  41. //運行時加載,動態加載類
  42. Class c1 = Class.forName(args[1]);
  43. //經過類類型加載對象。
  44. //返回的是包含N個class的接口,以避免程序編譯錯亂
  45. RunBetter rb = (RunBetter)c1.newInstance();
  46. rb.startPro();
  47. }
  48. 在這個代碼中咱們經過得到類類型newInstance。而後再執行startPro中的方法。
  49. 爲何不將
  50. RunBetter rb = (RunBetter)c1.newInstance();
  51. 寫成
  52. MainLoad rb = (MainLoad)c1.newInstance(); ???
  53. 由於MianLoad中咱們有多個方法,若是直接用這個類強轉,那程序可能隨機調用這個類中的某一個方法。因此咱們須要新建一個接口。
  54. 當程序擴展的時候,直接在接口增長功能模塊,就像咱們升級手機上的程序不須要下載完整的安裝包同樣,這個時候直接添加功能模塊就能夠,不用在編譯了。
  55. 程序源碼:http://download.csdn.net/detail/jacxuan/9714217
相關文章
相關標籤/搜索