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. python注解(装饰器)的用法

    带参数的要用三层def,第一层写注解里的参数,第二层写函数,第三层写具体逻辑. 如果是不带参数的注解,直接使用后两层即可 def needPermission(permissionstr): def ...

  2. Spring----01. 入门知识,IoC/DI

    1.spring两个最基本概念:依赖注入DI.面向切面AOP 2.spring通过上下文Application Context装配bean,实现方式的区别是如何加载它们的配置信息, ClassPath ...

  3. 常用sql语句 DML语句

    1.select  *|字段名 from 表名 [where 条件] [order by 排序 asc|desc] [limit 限制输出 startrow,pagesize] 查询 2.insert ...

  4. 汕头市队赛 SRM 08 B

    B-3 SRM 08 描述 给长度为 n 的数列 A 和长度为 m 的数列 B,问有多少长度为 m 的数列 C 满足 输入格式 第一行俩整数 n 和 m 第二行 n 个整数 ,表示数列 A 第三行 m ...

  5. [HNOI2002] 公交车路线

    题目背景 在长沙城新建的环城公路上一共有8个公交站,分别为A.B.C.D.E.F.G.H.公共汽车只能够在相邻的两个公交站之间运行,因此你从某一个公交站到另外一个公交站往往要换几次车,例如从公交站A到 ...

  6. UVA 10801 Lift Hopping 最短路

    2种方式直接代码就可以了.注意首次不需要60S的转换 #include <map> #include <set> #include <list> #include ...

  7. Selenium2+python自动化17-JS处理滚动条【转载】

    前言 selenium并不是万能的,有时候页面上操作无法实现的,这时候就需要借助JS来完成了. 常见场景: 当页面上的元素超过一屏后,想操作屏幕下方的元素,是不能直接定位到,会报元素不可见的. 这时候 ...

  8. python爬虫beautifulsoup4系列1【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/beautifulsoup4/ 前言 以博客园为例,爬取我的博客上首页的发布时间.标题. ...

  9. Javascript中call、apply函数浅析

    call/apply函数作用其实就是改变this的取值,有一句话是:谁调用的这个方法那方法里的this就是指谁,而有时我们会需要改变this值,所以call/apply就能派上用场. 下面我写个方法来 ...

  10. Codeforces 938D Buy a Ticket (转化建图 + 最短路)

    题目链接  Buy a Ticket 题意   给定一个无向图.对于每个$i$ $\in$ $[1, n]$, 求$min\left\{2d(i,j) + a_{j}\right\}$ 建立超级源点$ ...