我知道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
方法,但也没有调用。
答案 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是: