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.java、Word.java、Excel.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 反射理解(二)-- 动态加载类的更多相关文章
- java反射机制与动态加载类
什么是java反射机制? 1.当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.我们认为java并不是动态语言,但是它却有一个非常突出的动态相关机制,俗称:反射. IT行业里这么说,没有 ...
- java reflect 初始学习 动态加载类
首先要理解Class类: 在java 的反射中,Class.forName("com.lilin.Office") 使用类的全名,这样获取,不仅仅表示了类的类类型,同时还代表着类的 ...
- [改善Java代码]使用forName动态加载类文件
动态加载(Dynamic Loading)是指在程序运行时加载需要的类库文件,对Java程序来说,一般情况下,一个类文件在启动时或首次初始化时会被加载到内存中,而反射则可以在运行时再决定是否需要加载一 ...
- Java动态加载类
详见:https://blog.csdn.net/zai_xia/article/details/80026325 扩展:java反射机制与动态加载类 https://www.cnblogs.com/ ...
- java反射动态加载类Class.forName();
1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
- Java动态加载类在功能模块开发中的作用
Java中我们一般会使用new关键字实例化对象然后调用该对象所属类提供的方法来实现相应的功能,比如我们现在有个主类叫Web类这个类中能实现各种方法,比如用户注册.发送邮件等功能,代码如下: /* * ...
- Java运行时动态加载类之ClassLoader
https://blog.csdn.net/fjssharpsword/article/details/64922083 *************************************** ...
- java动态加载类和静态加载类笔记
JAVA中的静态加载类是编译时刻加载类 动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子 现在我创建了一个类 实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...
随机推荐
- RHSA-2018:0014-重要: linux-firmware 安全更新
修复命令: yum update iwl2030-firmware yum update iwl5000-firmware yum update iwl100-firmware yum update ...
- 14.链表中倒数第k个结点 Java
题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路 快指针和慢指针,快指针先跑K个单位然后慢指针开始跑,快指针跑到最后一个节点的时候慢指针对应的就是链表中倒数第k个结点 public stat ...
- echarts中国地图3D各个城市标点demo
<!DOCTYPE html><html><head> <meta charset="UTF-8"> <meta ...
- HearthBuddy Magnetic 磁力
https://hearthstone.gamepedia.com/Magnetic Magnetic is an ability exclusive to certain Mech minions ...
- HearthBuddy BotManager
MainWindow private void button_0_Click(object sender, RoutedEventArgs e) { Configuration.Instance.Sa ...
- 为macos开启外接显示器hdpi分辨率
安装了Switch RES,但是缺少当前显示器合适的HDPI分辨率的时候,可以参考这里,自动生成合适的配置文件. https://comsysto.github.io/Display-Override ...
- 本地服务CURL请求本地另一个服务API返回超时/或无返回
入职之后一直在忙,终于有时间整理一波最近踩到的坑. 起因: 项目是微服务架构,一个项目对外提供API,新的项目调用API获得数据.于是就在本地搭建了两个服务.配置了两个虚拟域名,指向两个项目,当然我本 ...
- C语言处理CSV数据
以下代码为博客 <Python的并行求和例子>: http://www.cnblogs.com/instant7/p/4312786.html 中并行python代码的C语言重写版. 用C ...
- vector subscript out of range
报这个错时会弹出一个窗口,貌似内存溢出,这是什么由于vector存放的数据超出了vector的大小所造成的. 解决方法如下: 在Vector<string> vector之后,不能直接通过 ...
- a lot of attention under the hood
Because one of the original goals of the Node.js project was to allow developers to easily build app ...