java反射:动态加载类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mrs_Wu/article/details/78290036

    我们在编程时也许会遇到这样的问题,当我们在定义两个类对象时,如果其中一个类不存在,或者类的方法找不到,那么即使另外一个类以及其类方法是存在并且正确的,我们在运行时也会报错,如以下这个问题:

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

    通过一个统一的接口,使得动态加载类时更为灵活,扩展功能时只要添加相应功能的类实现统一的接口即可
    功能性的类尽可能进行动态加载

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页