1.JAVA动态加载类和静态加载类的区别
new创建对象的方式称作为静态加载,而使用Class.forName("XXX")称作为动态加载,它们俩本质的区别在于静态加载的类的源程序在编译时期加载(必须存在),而动态加载的类在编译时期可以缺席(源程序不必存在)。
2.为什么需要动态加载类
对于我自己的理解,动态加载类增加了程序的灵活性。比如一个程序中有50个功能,但你可能只会使用其中的一个,如果你用的是静态加载的方式,你必须在编译前提供100个功能的所有定义,否则无法编译通过,若你使用的是动态加载机制,则不需要如此大费周章,用哪一个就定义哪一个即可(后面会举例子)。
以下举例子说明动态加载类和静态加载类的区别以及动态加载类的用法和优点。
假设Test.java中程序如下:
public class Test{
public static void main(String[] args){
if("A".equals(args[0])){
new A().print();
}
if("B".equals(args[0])){
new B().print();
}
}
}
如果你不定义A类和B类,则会出现编译错误。
若你想程序能运行,必须定义A和B。
假想如下场景,Test中有100个功能,你只想使用A功能,如果你使用的是静态加载的机制,你必须定义其余的99种功能才能使用A功能,如果使用动态加载机制,不仅不用定义99中功能,通过实现某种标准(继承某个接口),将大大方便了代码的编写。
Test.java
public class Test{
public static void main(String[] args){
try{
Class c = Class.forName(args[0]);
MyStandard me = (MyStandard)c.newInstance();
me.print();
}catch(Exception e){
e.printStackTrace();
}
}
}
A.java
public class A implements MyStandard{
public void print(){
System.out.println("A");
}
}
B.java
public class B implements MyStandard{
public void print(){
System.out.println("B");
}
}
Mystandard.java
interface MyStandard{
public void print();
}
使用命令行:
java Test A使用A功能
java Test B使用B功能
小伙伴们,是不是很方便呢,以上就是我对动态加载和静态加载的理解,比较浅显,哪位小伙伴发现我的错误或者有很多需要补充的,请私信我,万分感谢!