2

我知道 Java 使用 ClassLoader 层次结构来加载类。

例如一个程序:

public void test(){
    A a = new A(); // Line 1 The class is accessed first time here so it should be loaded and defined

    A ab = new A(); //Line 2 How can the second line be represented?
}

第一行代码类似于

Thread.currentThread().getContextClassLoader().loadClass("A");

所以类被加载并定义为创建Class.

现在的问题是当第二行Class A被再次引用时,Java 不会再次查找该类并返回该类的相同加载实例吗?

正如 Java 类加载器文档所说,每个类加载器都应该维护已加载类的实例,并为下一次调用返回相同的实例。

Java 将加载的类保存在哪里?ClassLoader类有一个Vector类,VM 调用它来添加加载的类。

也许这个问题有点令人困惑,基本上我试图找出已经加载的类是从哪个方法返回的。我试图在loadClass()方法中保留一个调试点,但它没有被调用Line 2

hasloadClass()方法的方法,但也没有调用。ClassLoaderfindLoadedClass

4

2 回答 2

2

如果您想将提及“翻译”A到任何方法调用,那么您可以获得的最接近的不是loadClass()but Class.forName()

此方法调用查询类的类加载器,这可能会也可能不会触发类加载(调用者甚至不关心)。它只会将一个完全加载的(并且已初始化,如果您不使用三参数版本)类返回给调用者。

并且一旦加载了类,在使用类时就不再调用类加载器(顾名思义,一旦加载了类,它的工作就完成了)。

于 2013-09-10T12:11:23.910 回答
1
package java_language;

public class NewClass {

    Java_language j;
    
    public NewClass() throws ClassNotFoundException {
        j=new Java_language();
         if (Class.forName("java_language.Java_language", true, Thread.currentThread().getContextClassLoader()).equals(j.getClass())) {
            System.out.println("CLass has been loaded");
        }
    }

    public static void main(String[] args) throws ClassNotFoundException {
       new NewClass();
        
    }

}

package java_language;

public class Java_language {

    static Java_language java_language = null;
    public Java_language() {
        System.out.println("Stack Overflow");
    }
}

Ans is: 在此处输入图片描述

于 2017-07-07T09:29:58.570 回答