天天看点

Class.forName()和ClassLoader.loadClass()区别

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处就不会有输出。