java反射加载类_Java反射第二课 动态加载类

在第一节课中我们讲的第三种方法

Class.forName("类的全称");

不仅表示了类的类类型,还代表了动态加载类

请大家区分编译,运行

编译时刻加载类是静态加载类,运行时刻加载类是动态加载类

现在的开发工具比如eclipse把编译过程给隐藏了

下面做一个实验

比如用记事本编写下面的Office.java文件

class Office {

public static void main(String[] args) {

if(("Word").equals(args[0])){

Word w = new Word();

w.start();

}

if(("Excel").equals(args[0])){

Excel e = new Excel();

e.start();

}

}

}

347c37168fe9c74cfb06c96b49e7248c.png

会报错

因为new创建对象是静态加载类,在编译时刻就要加载所有的可能使用到的所有类

现在我们创建World类

这时编译报Exel类找不到(因为我只创建了World没有创建Excel类)。

但是这样是不是有什么问题???

如果我们只想使用Word功能,没有Excel类程序的Word功能也不能使用是不是不太好。如果Office有100个功能,有一个功能有问题,其他99个功能都不能用这样是不是不太好!!!!

因为new创建对象是静态加载类,在编译时刻就要加载所有的可能使用到的所有类

如果我们像要实现用到那个类才加载那个类。没用到就不加载。如何实现?(用到哪部分的功能就去加载对应的代码,没有用到就不加载,这样即使一个功能有问题,其他99个功能照样可以用)

其实这就是动态加载类。

如何动态加载类呢?

优化程序:

public class OfficeBetter {

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();

}

}

}

OfficeAble是一个标准,让Word和Excel实现这个接口

interface OfficeAble {

public void start();

}

这样编译不会有任何问题

如果我要用Word功能,只要让World实现OfficeAble接口就行了

class Word implements OfficeAble {

@Override

public void start() {

// TODO Auto-generated method stub

System.out.println("word start");

}

}

如果要添加新的功能,只需要实现officeAble接口就行了,原来的代码不用改

一般功能性的类使用动态加载

比如QQ的在线升级,原来的代码不用变只需要添加新的功能就行了

原文:http://blog.csdn.net/wei_chong_chong/article/details/52128203

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值