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. Final——PowerShell Empire

    一.介绍 Empire是一款针对Windows平台的.使用PowerShell脚本作为攻击载荷的渗透攻击框架工具,具有从stager生成.提权到渗透维持的一系列功能.Empire实现了无需powers ...

  2. 将蓝牙rssi(信号强度)转换成距离

    遇到一个问题,是将蓝牙rssi(信号强度)转换成距离的问题. 这一问题没有准确的解决办法,但是有人做过一个拟合回归函数,其变化规律比较类似于rssi的变化规律,函数如下: d = ^(abs(rssi ...

  3. 解决WAMP Server与IIS端口冲突问题

    版本前提: 腾讯云服务器 windows server 2012 R2 WampServer3.10  64bit 有两种思路 一.修改wamp端口 文件位置   C:\wamp64\bin\apac ...

  4. PhoneUtils

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class PhoneUtils { /** * @par ...

  5. 《计算机系统要素》第四章 类汇编语言 Hack

    这章通过学习书中自己设计的Hack语言的使用,弄懂汇编语言的工作原理. 汇编语言最接近底层了,因为每个指令对应一个二进制编码. 当这些指令都变成...0101011100101...的形式后,内存Me ...

  6. Fluent操作流程&&udf编译

    Fluent 操作流程 1, 读网格模型 2, Scale修改单位 3, Check检查网格是否符合要求,最小体积不能出现负数 4, Time 选择瞬态,重力设置 5, Models-Multipha ...

  7. MATLAB学习(四)线性方程求解,多项式运算,函数局部最优解

    >> A=[2 1 3;1 3 2];B=[5;10] B = 5 10 >> X=lsqnonneg(A,B) X = 0 2.8571 0.7143 >> A\ ...

  8. Canal——增量同步MySQL数据到ElasticSearch

    1.准备 1.1.组件 JDK:1.8版本及以上: ElasticSearch:6.x版本,目前貌似不支持7.x版本:       Kibana:6.x版本:     Canal.deployer:1 ...

  9. Pytorch-拼接与拆分

    引言 本篇介绍tensor的拼接与拆分. 拼接与拆分 cat stack split chunk cat numpy中使用concat,在pytorch中使用更加简写的 cat 完成一个拼接 两个向量 ...

  10. 为lumen添加session支持

    为lumen添加session支持,同时配置全局函数csrf_token可用 首先laravel和lumen框架的版本要一致,我这里版本都是5.4 1.复制laravel框架config目录下的ses ...