码迷,mamicode.com
首页 > 编程语言 > 详细

Java反射第二课 动态加载类

时间:2016-08-05 17:58:09      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

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

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的在线升级,原来的代码不用变只需要添加新的功能就行了


Java反射第二课 动态加载类

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!