zoukankan      html  css  js  c++  java
  • java reflect 初始学习 动态加载类

    首先要理解Class类:

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

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

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

    动态加载总用场景:

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

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

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

    public interface OfficeAble {
        /**
         * 功能启动
         */
        void start();
    }

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

    package reflect;
    
    /**
     * @author lilin
     * 
     */
    public class Word implements OfficeAble {
    
        @Override
        public void start() {
            System.out.println("启动运行 word程序!");
        }
    
    }

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

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

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

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

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

    package reflect;
    
    /**
     * @author lilin
     * 
     */
    public class Excel implements OfficeAble {
    
        @Override
        public void start() {
            System.out.println("启动运行 EXCEl程序!");
        }
    
    }
  • 相关阅读:
    LeetCode(65):有效数字
    LeetCode(64):最小路径和
    物理Data Guard的日常维护
    Oracle Data Guard的配置
    SQL基础--完整性约束
    使用rman迁移数据库到异机
    Oracle的表空间和数据文件
    Oracle的控制文件
    Oracle重做日志文件
    RMAN的恢复篇
  • 原文地址:https://www.cnblogs.com/lilin0719/p/5229261.html
Copyright © 2011-2022 走看看