Class.forName()和ClassLoader.loadClass()区别?
Class.forName():将类的.class文件加载到jvm中,并且对类进行解释,执行类中的static块;
ClassLoader.loadClass():只会将.class文件加载到jvm中,不会执行static中的内容,但是在newInstance会去执行static块。
public void test12(){
ClassLoader classLoader = Test.class.getClassLoader();
try {
Class<?> person = classLoader.loadClass(Person.class.getName()); //1
Class.forName(Person.class.getName()); //2
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public class Person {
static {
System.out.println("static Person...."); }
}
执行1 处没有输出。
执行2处 输出 static Person....。
请注意!
Class.forName(name, initialize, loader)函数第二个参数可以指明是否加载static块,并且只有调用了newInstance()方法采用调用构造函数,创建类的对象 。
参数:
name 类型全限定名
initialize 是否初始化static true:初始化 false 不初始化static
loader 类加载器
public void test12(){
ClassLoader classLoader = Test.class.getClassLoader();
try {
Class<?> person = classLoader.loadClass(Person.class.getName()); //1
Class.forName(Person.class.getName()); //2
Class.forName(Person.class.getName(),true,classLoader); //3
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
但是当class.forname 和Class.forName(...)同时出现在一个方法时,static只会初始化一次。
也就说在2处打印了 “static person....” 3处就不会有输出。