一、什么是动态加载类?什么又是静态的加载类?
Class.forName 不仅表示类的类型,还代表了动态加载类。编译时加载是静态加载类,运行时加载是动态加载类。
也就是说,new 是静态加载类,在编译时刻就需要加载所有可能使用到的功能,如果该类不存在,编译将不会通过,就会报错。而在日常中我们希望用到哪个就加载哪个,不用不加载,即使有的类不存在编译也会通过,就需要动态加载类。
二、举例
1、静态加载类举例
public class Main{
public static void main(String args[]){
if("A".equals(args[0])){
A a=new A();
a.start();
}
if("B".equals(args[0])){
B b=new B();
b.start();
}
}
}
上述代码中,并没有写A类和B类及它们的start()。在编译的时候就会报错。
2、动态加载类举例(有时也叫动态代理)
public class Main{
public static void main(String args[]){
try{
Class c=Class.forName(args[0]); //代表所有的类,即所有的类都是class类的实例
All a=(All)c.newInstance(); //代表所有类的一个实例,这里使用了多态
a.start();
}catch(Exception e){
e.printStackTrace();
}
}
}
class A implements All{
public void start(){
System.out.println("A....START");
}
}
class B implements All{
public void start(){
System.out.println("B....START");
}
}
//接口
interface All{
public void start();
}
上述代码中,并没有像静态加载类那样在main()方法中,通过new关键字创建所有类的具体对象(即并没有指定我们需要实现的对象是属于哪些类的),也就不可能出现,若类不存在而编译失败的问题了。在运行程序时,需要哪个类的对象就动态的创建哪个类的对象,也就是说动态的实现了类的加载。