在第一节课中我们讲的第三种方法
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的在线升级,原来的代码不用变只需要添加新的功能就行了