类加载器的loadClass()方法会将类加载到内存中吗?

3

我希望创建自定义类加载器。但是,我对loadClass()方法感到困惑,这个方法是否将指定的类加载到内存中?

如果是的话,为什么指定类的静态块没有被调用?

//main class

package custom_class_loader1;


public class Custom_class_loader1 {


    public static void main(String[] args) {

        try{
        CustomClassLoader c=new CustomClassLoader();
       Class c1= c.loadClass("custom_class_loader1.ABC");/**does this load ABC class into memory?**/

        }catch(Exception e)
        {
            System.out.println(e);

    }
}
}
2个回答

7

当你加载一个类时,默认情况下它不会初始化,直到被使用。

调用该方法相当于调用loadClass(name, false);

这里的false表示不要解析该类。

控制这种行为的一种方法是使用Class.forName()。

public class Main {
    public static void main(String[] args) throws ClassNotFoundException {
        ClassLoader cl = new URLClassLoader(new URL[0], ClassLoader.getSystemClassLoader());
        System.out.println("unresolved Test");
        cl.loadClass("Test");
        // or
        Class.forName("Test", false, cl);

        System.out.println("\ninitialise Test");
        Class.forName("Test", true, cl);
    }
}

class Test {
    static {
        System.out.println("Loaded Test class");
    }
}

打印

unresolved Test

initialise Test
Loaded Test class

1
我们有三个步骤:加载、链接和初始化。loadClass在第二步完成。 - Andreas Dolk

1

它还能在哪里加载呢?loadClass返回一个类型为Class<?>的对象,该对象表示刚刚加载的类。


静态块在初始化时被调用。 - Clark Bao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接