1、静态类加载
说到动态加载,就得说说静态加载了。
下面就通过一个例子来说明静态加载的特点:
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文件的时候(静态编译),一旦哪个类没有,不管是否会用到,都会编译失败。
这样显然不是我们希望看到的效果。那现在很多产品的在线下载文件做增量更新是怎么做到的呢?
这就需要引入一个概念:动态加载
2、动态加载类
首先我们创建一个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高级开发必须懂的】第二节