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程序!");
} }
java reflect 初始学习 动态加载类的更多相关文章
- java反射机制与动态加载类
什么是java反射机制? 1.当程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言.我们认为java并不是动态语言,但是它却有一个非常突出的动态相关机制,俗称:反射. IT行业里这么说,没有 ...
- [改善Java代码]使用forName动态加载类文件
动态加载(Dynamic Loading)是指在程序运行时加载需要的类库文件,对Java程序来说,一般情况下,一个类文件在启动时或首次初始化时会被加载到内存中,而反射则可以在运行时再决定是否需要加载一 ...
- Java动态加载类
详见:https://blog.csdn.net/zai_xia/article/details/80026325 扩展:java反射机制与动态加载类 https://www.cnblogs.com/ ...
- java动态加载类和静态加载类笔记
JAVA中的静态加载类是编译时刻加载类 动态加载类指的是运行时刻加载类 二者有什么区别呢 举一个例子 现在我创建了一个类 实现的功能假设为通过传入的参数调用具体的类和方法 class offic ...
- Java动态加载类在功能模块开发中的作用
Java中我们一般会使用new关键字实例化对象然后调用该对象所属类提供的方法来实现相应的功能,比如我们现在有个主类叫Web类这个类中能实现各种方法,比如用户注册.发送邮件等功能,代码如下: /* * ...
- Java运行时动态加载类之ClassLoader
https://blog.csdn.net/fjssharpsword/article/details/64922083 *************************************** ...
- Java 反射理解(二)-- 动态加载类
Java 反射理解(二)-- 动态加载类 概念 在获得类类型中,有一种方法是 Class.forName("类的全称"),有以下要点: 不仅表示了类的类类型,还代表了动态加载类 编 ...
- java反射动态加载类Class.forName();
1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
随机推荐
- 全局变量&局部变量
一.局部变量: 定义在函数内部的变量以及函数的形参成为局部变量 作用于:从定义那一行开始知道与其所在的代码块结束 生命周期:从程序运行到定义那一行开始分配存储空间到程序离开该变量所在的作用域 特点: ...
- python中get、post数据
方法一:urllib2 参考:http://www.cnblogs.com/chenzehe/archive/2010/08/30/1812995.html post: #!/usr/bin/pyth ...
- BZOJ1002 轮状病毒
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...
- spring HibernateValidator 验证 子类不起作用
spring HibernateValidator 验证 子类不起作用,在要验证的子类前加上@Valid即可. public class UserInfo { private int Id; @Val ...
- 用C++实现网络编程---抓取网络数据包的实现方法
一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包.抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议.IP.UDP.TCP.甚至各 ...
- 在XML序列化时去除默认命名空间xmlns:xsd和xmlns:xsi
摘 自: http://blog.csdn.net/fxhflower/article/details/7276820 可使用以下代码: //Create our own namespaces for ...
- HTML与XHTML的区别
为什么要使用XHTML? 我们认为万维网上的许多页面都包含着糟糕的 HTML 代码. 下面的 HTML 代码仍然可以工作得很好,即使它没有遵守 HTML 规则: <html> <he ...
- javaSE27天学习目录
第一阶段(java基础知识) 计算机基础知识 Java开发环境的搭建和应用 机制转换 有符号数据表示法(原码.反码.补码) Java语句基础(关键字.标识符.注释.常量.变量.数据类型.运算符) ...
- 使用SE16N_INTERFACE
调用函数直接修改table数据 在PRD上通常没有权限 但是可以激活sap内置的修改模式 SE16N 修改表数据.增加.删除行项目: 1. Execute tcode ...
- N层电梯只停一层情况下,求所有人爬楼层数最少
一.题目: 石家庄铁道大学基础教学楼一共有四部电梯,每层都有人上下,电梯在每一层都停.信1201-1班张一东每层都停有点儿不耐烦.如果在上下课高峰时刻电梯从一层上行,但只允许停留在某一层.每个人选择自 ...