说到动态加载,就得说说静态加载了。
下面就通过一个例子来说明静态加载的特点:
class Office{ public static void main(String[] args){ //new 创建对象 是静态加载类, //在编译时刻就需要加载所有可能使用到的类。 //不管是否使用到 //通过动态加载类可以解决该问题 if("Word".equals(args[0])){ Word w = new Word(); w.start(); } if("Excel".equals(args[0])){ Excel e = new Excel(); e.start(); } } }编译
假如可能用到2个类,但是我们只想使用其中的某一个类Word,而不使用其他类。而在java代码编译成字节码.class文件的时候(静态编译),一旦哪个类没有,不管是否会用到,都会编译失败。
这样显然不是我们希望看到的效果。那现在很多产品的在线下载文件做增量更新是怎么做到的呢?
这就需要引入一个概念:动态加载
首先我们创建一个OfficeBetter.java的文件(对比上面Office.java)
这里需要对类的表示方式有个基本的了解:https://blog.csdn.net/stoneWang_L/article/details/90578180
class OfficeBetter{ public static void main(String[] args){ try{ //动态加载类,在运行时加载 Class c = Class.forName(args[0]); //通过类类型(class type)创建该类对象 OfficeAble oa = (OfficeAble)c.newInstance(); oa.start(); } catch (Exception e){ e.printStackTrace(); } } }interface OfficeAble{ public void start(); } class Word implements OfficeAble{ public void start(){ System.out.println("Word ... starts ..."); } }
这个时候,我们再编译,会报错么?
结果是不会的。只有当我们调用确定的类(Excel)时,如果该类不存在,那才会出现报错的情况。
这就是类的动态加载的一个简单的例子。
备注:该文章参考慕课Cedar老师的课程【反射——Java高级开发必须懂的】第二节