我们在编程时也许会遇到这样的问题,当我们在定义两个类对象时,如果其中一个类不存在,或者类的方法找不到,那么即使另外一个类以及其类方法是存在并且正确的,我们在运行时也会报错,如以下这个问题:
if("Word".equals(args[0])) {
Word word=new Word();
word.start();
}
if("Excel".equals(args[0])) {
Excel excel=new Excel();
excel.start();
}
运行结果显示,Word和Excel类不存在,并且start()方法找不到,这时我们进行如下操作:
class Word{
public void start() {
System.out.println("Word Start");
}
}
创建Word类和Word类中的start()方法之后,再次运行该程序,此时仍然会报出两个错误:Excel类以及Excel类中的start()方法不存在
这是因为用new创建对象,是静态加载类,在编译时刻就要加载所有可能存在的类
但如果我们只用Word类,不使用Excel类,这种静态加载类就不能满足我们的要求。假设如果有一百个类,而只有一个类不能通过编译,则其他所有的类都不能使用,这不是我们所希望看到的。
这要求类在运行时动态加载,需要用到哪个类,就加载哪个类,其他类的情况不会影响到这个类
class dynamicBetter{
public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class c=Class.forName(args[0]);
Word w=(Word)c.newInstance();//通过类类型创建该类的对象
}
如上,我们通过该类的类类型来创建某一个类的对象,此时实现了动态加载类,在编译过程中不会报出任何错误
此时我们在动态加载Word时可以得到运行结果,那么如果动态加载的是Excel类呢?为了保证统一性,可以进行如下操作:
public static void main(String args[]) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
Class c=Class.forName(args[0]);
//Word w=(Word)c.newInstance();//通过类类型创建该类的对象,要想让Word和Excel都可以用,要进行统一
OfficeAble oa=(OfficeAble)c.newInstance();
oa.start();
}
interface OfficeAble{
public void start();
}
class Word implements OfficeAble{//实现统一接口
public void start() {
System.out.println("Word Start");
}
}
通过一个统一的接口,使得动态加载类时更为灵活,扩展功能时只要添加相应功能的类实现统一的接口即可
功能性的类尽可能进行动态加载