专栏首页weixuqin 的专栏Java 反射理解(二)-- 动态加载类

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

概念

在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点:

  • 不仅表示了类的类类型,还代表了动态加载类
  • 编译时刻加载类是静态加载类,运行时刻加载类是动态加载类

演示

我们以具体的代码来演示什么是动态加载类和静态加载类:

  • 新建:Office.java
class Office
{
    public static void main(String[] args) {
        
        // new 创建对象,是静态加载类,在编译时刻就需要加载所有的可能使用到的类
        // 通过动态加载类可以解决该问题
        if ("word".equals(args[0])) {
            Word w = new Word();
            w.start();
        }
        if("Excel".equals(args[0])) {
            Excel e = new Excel();
            e.start();
        }
    }
}

如果运行该程序,会报错,因为 new 创建对象,是静态加载类,在编译时刻就需要加载所有的可能使用到的类,但我们并没有 Word 和 Excel 类。

我们通过 Class.forName("具体包名") 来动态加载类。

  • 新建 OfficeBetter.java
class OfficeBetter {
    public static void main(String[] args) {
        try {
            // 动态加载类,在运行时刻加载
            // args 是使用命令行的参数列表 形如:  java  指定的程序名 参数 
            // args[0]即参数列表的第一个参数
            Class c = Class.forName(args[0]);
            //通过类类型,创建该类对象
            OfficeAble oa = (OfficeAble) c.newInstance();
            oa.start();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

执行 javac 后我们发现程序并没有报错,因为该类动态加载 OfficeAble ,编译过程不加载,只在运行时刻加载。

  • 我们新建 OfficeAble.javaWord.javaExcel.java

OfficeAble.java

interface OfficeAble {
    public void start();
}

Word.java :

class Word implements OfficeAble {
    public void start() {
        System.out.println("word...starts...");
    }
}

Excel.java

class Excel implements OfficeAble {
    public void start() {
        System.out.println("Excel...Start...");
    }
}

执行:

java OfficeBetter Word

可以看到便顺利打印出:word...start...

此时 OfficeBetter.java 是并没有重新编译过的,这就说明了 Word 类是动态加载的。

同理,执行:

java OfficeBetter Excel

打印出:excel...start...,Excel 类是动态加载的。


完。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《深入理解 Java 虚拟机》学习 -- 类加载机制

    虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制...

    希希里之海
  • Spring 的 Bean 管理(注解方式)

    除了 @Component 外,Spring 提供了 3 个功能基本和 @Component 等效的注解

    希希里之海
  • JDBC技术

    任何一种数据库驱动程序都提供一个 java.sql.Driver 接口的驱动类,在加载某个数据库驱动程序的驱动类时,都创建自己的实例对象并向 java.sql....

    希希里之海
  • 自定义类加载器和动态加载 Java 代码

    有时候,我们需要 java 像脚本一样的运行,甚至是希望我们的代码是热部署,一旦代码文件发生变动就重新加载这个代码,能实现吗?今天就来试着解决下。

    breezedancer
  • AutoMapper使用手册(一)

    蘑菇先生
  • 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射

      在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据...

    程序员宇说
  • RPC框架是啥之Java自带RPC实现,RMI框架入门

    首先RMI(Remote Method Invocation)是Java特有的一种RPC实现,它能够使部署在不同主机上的Java对象进行通信与方法调用,它是一种...

    Java猫说
  • 单例模式深入理解

    最近去平安系面试时,遇到了个人技术领域认定的一大偶像吴大师(Cat作者),他随口问了个单例的问题,要求基于Java技术栈,给出几种单例的方案,并给出单元测试代码...

    用户1216676
  • 加加减减的奥秘——从数学到魔术的思考(二)

    爱学习,勤思考;学数学,玩魔术。欢迎点击头部蓝字关注MatheMagician,这里有你要的奇迹!

    magic2728
  • 干货 | 模型优化不得不思考的几个问题

    作者简介 胡淏,美团算法工程师,毕业于哥伦比亚大学。先后在携程、支付宝、美团从事算法开发工作。了解风控、基因、旅游、即时物流相关问题的行业领先算法方案与流程。 ...

    携程技术

扫码关注云+社区

领取腾讯云代金券