Java如何找到已经加载的类?

时间:2013-09-10 10:57:48

标签: java class classloader

我知道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调用它。

loadClass()的{​​{1}}方法有ClassLoader方法,但也没有调用。

2 个答案:

答案 0 :(得分:2)

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

此方法调用查询类的类加载器,这可能会也可能不会触发类加载(调用者甚至不关心)。它只会将完全加载(并初始化,如果你不使用the three-argument version)类返回给调用者。

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

答案 1 :(得分: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是:
Answer screenshot