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 类是动态加载的。


完。

Java 反射理解(二)-- 动态加载类的更多相关文章

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

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

  2. java reflect 初始学习 动态加载类

    首先要理解Class类: 在java 的反射中,Class.forName("com.lilin.Office") 使用类的全名,这样获取,不仅仅表示了类的类类型,同时还代表着类的 ...

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

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

  4. Java动态加载类

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. TCP学习

    参考 https://coolshell.cn/articles/11564.html https://coolshell.cn/articles/11609.html

  2. Go Iris 中间件

    Iris 中间件 当我们在 iris 中讨论中间件时,我们讨论的是在HTTP请求生命周期中在主处理程序代码之前和/或之后的运行代码. 实现中间件功能,有下面这样两种方式: 方式一: 我们可以通过按顺序 ...

  3. Android input输入框 移动页面input手机键盘中的“搜索”按键

    动页面input手机键盘中的“搜索”按键 满足以下几点机即可: input type="search"    放到form标签中    使用action属性 <form ac ...

  4. FFmpeg之Linux下编译与调试

    注:下面的一切都是在 root 模式下进行的,可以不再 root 模式下进行 1. 安装linux的基础环境 基础环境就是编译代码的基础库,Ubuntu联网安装软件很简单,一个语句即可搞定,这里列出语 ...

  5. 9Patch图

    NinePatch是一种很有用的PNG图片格式,它可以在特定区域随文字大小进行缩放. - 上边线控制水平拉伸- 左边线控制竖直拉伸- 右边线和下边线控制内容区域 如下: 背景图片的中间区域会随着文字的 ...

  6. 03 MySQL之数据类型和运算符

    01-数据类型 MySQL支持多种数据类型,主要有 数值类型.日期/时间类型和字符串类型. 1.1 整数类型 1.2 浮点数类型和定点数类型 单精度浮点类型(FLOAT)和双精度浮点类型 (DOUBL ...

  7. C#.net winform skin 皮肤大全

    C#.net winform skin 皮肤大全 1. 东日IrisSkin IrisSkin 共有两个版本,一个是IrisSkin.dll 用于.Net Framework1.0/1.1 和Iris ...

  8. ajax基础------备忘

    1:register.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" ...

  9. [Spark] Scala programming - basic level

    环境配置 IDE: https://www.jetbrains.com/idea/ 子雨大数据之Spark入门教程(Scala版) /* implement */ 语言特性 Online compil ...

  10. Scala面向对象01