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

JAVA反射机制--静态加载与动态加载的更多相关文章

  1. Java反射机制(四):动态代理

    一.静态代理 在开始去学习反射实现的动态代理前,我们先需要了解代理设计模式,那何为代理呢? 代理模式: 为其他对象提供一种代理,以控制对这个对象的访问. 先看一张代理模式的结构图: 简单的理解代理设计 ...

  2. Java反射机制深度剖析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java反射机制是Java语言中一种很重要的机制,可能在工作中用到的机会不多,但是在很多框架中都有用到这种机制.我们知道Java是一门静态 ...

  3. Java反射机制介绍

    1. 文档概述 Java反射是Java被视为动态(或准动态)语言的一个关键性质,Java反射机制容许程序在运行时加载.探知.使用编译期间完全未知的classes.换言之,Java可以加载一个运行时才得 ...

  4. 浅谈 java 反射机制

    一:Java反射概念 Java反射是Java被视为动态(或准动态)语言的一个关键性质.这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息,包括其mod ...

  5. 5. Java反射机制

    Java反射机制   问题: 在运行时,对一个JAVA类,能否知道属性和方法:能否调用它的任意方法? 答案是可以的,JAVA提供一种反射机制可以实现. 目录 什么是JAVA的反射机制 JDK中提供的R ...

  6. java反射机制(2)

    首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...

  7. Java反射机制详解(1) -反射定义

    首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...

  8. 入门级 JAVA反射机制

    1.什么是反射? Java中的反射机制是Java语言的一个很重要的特性,是Java “动态性” 的重要体现.Java反射机制让我们在程序运行状态中,对于任意一个类,都能知道这个类的所有属性和方法:对于 ...

  9. Java反射机制的浅显理解(这篇文章还没写好,留个草稿给自己看的)

    目前只是有一个大概的理解,先把自己感觉容易立即的概念放这里,等以后结合实际工作理解深刻了再来补充. 一.什么是Java反射机制?(多种定义) 1. JAVA反射机制是在运行状态中,对于任意一个类,都能 ...

随机推荐

  1. linux查看日志的方法

    linux查看日志文件内容命令tail.cat.tac.head.echo tail -f test.log你会看到屏幕不断有内容被打印出来. 这时候中断第一个进程Ctrl-C, ---------- ...

  2. python 下划线转驼峰

    # 下划线转驼峰 def str2Hump(text): arr = filter(None, text.lower().split('_')) res = '' j = 0 for i in arr ...

  3. Java Nio注意事项

    Selector  : public abstract class Selector extends Object SelectableChannel 对象的多路复用器. 可通过调用此类的 open ...

  4. Quartus2 通过Nativelink调用modelsim进行功能仿真(转载)

    quartus2建立工程后,编译并检查语法通过后(功能仿真都不需要综合) tips:这样你的工程层次化也同时完成了. 打开Assignment -> settings, 找到Simulation ...

  5. query的list()和iterate()区别 面试题

    query的list()和iterate()区别 1.返回的类型不一样,list返回List,iterate返回iterator 2.查询策略不同. 获取数据的方式不一样,list会直接查询数据库,i ...

  6. Windows ToolTips简要介绍(转)

    原文转自 https://blog.csdn.net/sesiria/article/details/77450151 Windows 标准控件ToolTips简要介绍 参考文档 MSDN https ...

  7. git代码仓库迁移(从github到oschina)【转】

    转自:http://blog.csdn.net/a5244491/article/details/44807937 版权声明:本文为博主原创文章,未经博主允许不得转载. 因为一些特殊原因,需要将公司原 ...

  8. 使用 Python 开始你的机器学习之旅【转】

    转自:https://linux.cn/article-8582-1.html 编译自:https://opensource.com/article/17/5/python-machine-learn ...

  9. 2.OpenStack-安装消息队列服务

    安装消息队列服务(安装在控制器上) yum install rabbitmq-server -y systemctl start mariadb.service 配置消息队列服务 systemctl ...

  10. Codeforces Round #446 (Div. 2) A. Greed【模拟】

    A. Greed time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...