zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Photoshop快捷键大全
    [转载]Ajax 教程:Ajax 入门简介
    Windows 7环境下安装Apache Http Server 2.2.19
    Words For Today [20110710]
    Words For Today [20110708]
    Words For Today [20110709]
    Eclipse的Spring库导入
    克隆虚拟机+Linux互相登录+秘钥认证(四)
    java+appium 自动化环境搭建
    VMware虚拟机安装Linux后忘记root密码怎么办(三)
  • 原文地址:https://www.cnblogs.com/qwop/p/6637326.html
Copyright © 2011-2022 走看看