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

会报错

因为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接口就行了

<pre name="code" class="java" style="font-size:10px;">class Word implements OfficeAble {

	@Override
	public void start() {
		// TODO Auto-generated method stub
		System.out.println("word start");
	}

}

 

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

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

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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值