标签:
在第一节课中我们讲的第三种方法
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(); } } }
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的在线升级,原来的代码不用变只需要添加新的功能就行了
标签:
原文地址:http://blog.csdn.net/wei_chong_chong/article/details/52128203