首先要理解Class类:

在java 的反射中,Class.forName("com.lilin.Office") 使用类的全名,这样获取,不仅仅表示了类的类类型,同时还代表着类的动态加载.

一般,我们编写好的java类,都要经过编译成class文件,然后才能被jvm执行字节码文件,通常我们比较熟悉的就是javac --》编译   java--》运行。

而类的动态加载,就是不需要编译的步骤,直接在运行时的动态加载。

动态加载总用场景:

一般用于功能性的类,方便添加/替换的扩展,类似于QQ的版本升级,OFFICE中的多个功能模块(WORD、EXCEL、PPT)。

下面用一个简单的实例,演示以下 动态加载的好处:

新建一个officeAble的接口类:定义统一的  office 启动接口。

  1. public interface OfficeAble {
  2. /**
  3. * 功能启动
  4. */
  5. void start();
  6. }

其次,建立好 自己的Word类,实现OfficeAble的接口,模拟测试word的启动操作:

  1. package reflect;
  2.  
  3. /**
  4. * @author lilin
  5. *
  6. */
  7. public class Word implements OfficeAble {
  8.  
  9. @Override
  10. public void start() {
  11. System.out.println("启动运行 word程序!");
  12. }
  13.  
  14. }

最后,建立自己的office测试运行类,命令行参数,传入类的全名作参数测试:reflect.Word

  1. package reflect;
  2.  
  3. /**
  4. * @author lilin
  5. *
  6. */
  7. public class Office {
  8. public static void main(String[] args) throws Exception {
  9. //动态加载类,在运行时刻加载,传入类的全名
  10. Class c = Class.forName(args[0]);
  11. //newInstance方法获取实例对象,通过强制转换成统一的 officeAble的接口,多态的方案
  12. OfficeAble officeAble = (OfficeAble) c.newInstance();
  13. officeAble.start();
  14. }
  15.  
  16. }

运行结果展示:启动运行 word程序! 完美运行,其实,本测试案例,最好用纯文本编辑代码,自己使用java 命令来编译执行,可以很清楚的指导,哪些是静态加载的类,哪些是动态的,动态加载的类,是不需要编译的,执行在运行时刻加载的。

如果现在,我们需要在增加一个PPT或者是EXCEL的功能,那我们只要仅仅新增加一个实现类,实现我们定义的统一的office接口,就能实时的运行我们新增加的功能类类。

类似于下面这样:运行时刻只要传入 reflect.Excel 的参数,就能实时的启动EXCEL的启动程序。

  1. package reflect;
  2.  
  3. /**
  4. * @author lilin
  5. *
  6. */
  7. public class Excel implements OfficeAble {
  8.  
  9. @Override
  10. public void start() {
  11. System.out.println("启动运行 EXCEl程序!");
  12. }
  13.  
  14. }

java reflect 初始学习 动态加载类的更多相关文章

  1. java反射机制与动态加载类

    什么是java反射机制? 1.当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.我们认为java并不是动态语言,但是它却有一个非常突出的动态相关机制,俗称:反射. IT行业里这么说,没有 ...

  2. [改善Java代码]使用forName动态加载类文件

    动态加载(Dynamic Loading)是指在程序运行时加载需要的类库文件,对Java程序来说,一般情况下,一个类文件在启动时或首次初始化时会被加载到内存中,而反射则可以在运行时再决定是否需要加载一 ...

  3. Java动态加载类

    详见:https://blog.csdn.net/zai_xia/article/details/80026325 扩展:java反射机制与动态加载类 https://www.cnblogs.com/ ...

  4. java动态加载类和静态加载类笔记

    JAVA中的静态加载类是编译时刻加载类  动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子  现在我创建了一个类  实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...

  5. Java动态加载类在功能模块开发中的作用

    Java中我们一般会使用new关键字实例化对象然后调用该对象所属类提供的方法来实现相应的功能,比如我们现在有个主类叫Web类这个类中能实现各种方法,比如用户注册.发送邮件等功能,代码如下: /* * ...

  6. Java运行时动态加载类之ClassLoader

    https://blog.csdn.net/fjssharpsword/article/details/64922083 *************************************** ...

  7. Java 反射理解(二)-- 动态加载类

    Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编 ...

  8. java反射动态加载类Class.forName();

    1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...

  9. 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息

    0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...

随机推荐

  1. 学习总结 java线程

    package com.hanqi.xc; public class Test1 { public static void main(String[] args) { // 线程测试 for (int ...

  2. Java Annotation 机制源码分析与使用

    1 Annotation 1.1 Annotation 概念及作用      1.  概念 An annotation is a form of metadata, that can be added ...

  3. prototype原型模式中的问题

    对于每个构造函数来说,都有一个prototype属性.对于每个对象实例来说,都有_proto_属性. 参看下面代码: function Person(){} Person.prototype={ na ...

  4. 【Hibernate 7】浅谈Hibernate的缓存机制

    一.Hibernate缓存机制简介 对于Hibernate本身来说,它的缓存主要包括三部分:session缓存(一级缓存).二级缓存.查询缓存. 1.1,session缓存 随着session的关闭而 ...

  5. [转]回答--python django学的很迷茫怎么办?

    作者:王一链接:http://www.zhihu.com/question/26235428/answer/36568428来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处 ...

  6. vs 异常处理

    解决方法: 4.0 删除 C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files 2..0 删除 C:/WINDOW ...

  7. JS时间

    function checkStartTime(){ var d1 = new Date(); var endTime = document.getElementById("secCreat ...

  8. 021ARM处理器工作模式

    1.User模式:usr,普通应用程序运行的模式: 2.FIQ模式:fiq,快速中断模式,当一个程序正在运行时,突然产生一个中断,而且这种中断属于快速中断,那么将进入快速中断模式下运行: 3.IRQ模 ...

  9. 如何实现Android 中断线程的处理

    我现在对一个用户注册的功能1.用ProgressDialog将当前页面设成不可操作(保留返回键 退出ProgressDialog)2.用一个线程clientThread执行数据的提交和返回 问题:考虑 ...

  10. [原]Hrbust1053 Warcraft III (完全背包)

    本文出自:http://blog.csdn.net/svitter 原题:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProbl ...