java反射:动态加载类

来源:互联网 发布:php实现api接口 编辑:程序博客网 时间:2024/05/14 05:20

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

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

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

原创粉丝点击