Java反射学习总结(2)——动态加载类
2016-06-15 21:11
489 查看
前面已经知道Class.forName()可以得到类的类类型,我们还可以通过它实现类的动态加载,比如在JDBC中加载数据库驱动我们就采用这种方式实现,类的加载有两种方式:编译时刻加载属于静态加载类,运行时加载属于动态加载。动态加载可以在源码编译期间缺失某些暂时用不到的类,当项目执行到一定阶段需要调用此类时,才进行加载。动态加载可以使项目维护变得简单,实现的新功能可以通过动态加载进去而无需改动原始代码,下面通过示例进行展示:
package reflectTest;
public class Office {
public static void main(String[] args){
try{
//动态加载类,在运行时刻加载
Class c = Class.forName(args[0]);
//通过类类型,创建该类对象
OfficeAble oa = (OfficeAble)c.newInstance();
oa.start();
}catch(Exception e){
e.printStackTrace();
}
}
}
//接口定义
interface OfficeAble{
public void start();
}
//实现Word类
class Word implements OfficeAble{
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("start Word...");
}
}
//实现Excel类
class Excel implements OfficeAble{
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("start Excel...");
}
}分析上面的例子,当运行时如果我们输入参数为Word,则动态加载Word类,打印输出start Word...,这时如果Excel类没有实现,程序运行都不会报错,因为不会加载Excel类,同理当运行时输入参数为Excel,处理过程同上。并且如果我们要扩展Office,添加PowerPoint等功能也非常简单,只要实现了PowerPoint类,Office类不做任何改动就可以
在运行时传入参数PowerPoint实现提供的功能。
package reflectTest;
public class Office {
public static void main(String[] args){
try{
//动态加载类,在运行时刻加载
Class c = Class.forName(args[0]);
//通过类类型,创建该类对象
OfficeAble oa = (OfficeAble)c.newInstance();
oa.start();
}catch(Exception e){
e.printStackTrace();
}
}
}
//接口定义
interface OfficeAble{
public void start();
}
//实现Word类
class Word implements OfficeAble{
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("start Word...");
}
}
//实现Excel类
class Excel implements OfficeAble{
@Override
public void start() {
// TODO Auto-generated method stub
System.out.println("start Excel...");
}
}分析上面的例子,当运行时如果我们输入参数为Word,则动态加载Word类,打印输出start Word...,这时如果Excel类没有实现,程序运行都不会报错,因为不会加载Excel类,同理当运行时输入参数为Excel,处理过程同上。并且如果我们要扩展Office,添加PowerPoint等功能也非常简单,只要实现了PowerPoint类,Office类不做任何改动就可以
在运行时传入参数PowerPoint实现提供的功能。
相关文章推荐
- 46. Spring Boot中使用AOP统一处理Web请求日志
- 反射(Reflect)
- 【SSM学习之路】用eclipse中的maven创建web项目
- Java记事
- java之修改并选择显示SQL Server数据库中的数据
- Java关键字final、static使用总结
- JavaWeb学习之Servlet3.0新特性详解
- Java多线程之内存可见性
- JavaBasic
- Spring MVC的实现原理
- Java关键字final、static使用总结
- Spring Framework Reference Documentation手册官网下载地址
- java的序列化和反序列化
- java反射机制
- Java反射学习总结(1)——Class类的使用
- spring MVC配置详解
- Java使用Properties小例子
- java线程池
- MySql与Java的时间类型
- Java 7 源码学习系列(三)——BigInteger