假设我只使用静态方法。类加载器在将类加载到内存时会加载每个导入的类吗?或者只有当一个方法需要访问它时才会加载导入?
问题是当类加载到内存时,或者在某些方法想要使用它们之前,类加载器是否加载导入。 如果这是第一个选项,我可能需要将一些 Util 类划分为更多专用。
答案 0 :(得分:20)
我认为您可以按如下方式测试:
package pkg1;
public class Test {
static {
System.out.println("Hello 111");
}
public static void meth() {
System.out.println("Hello 222");
}
}
测试1:
package pkg2;
import pkg1.Test;
public class Tester {
public static void main(String... args) {
Test t;
}
}
没有打印任何内容。
测试2:
package pkg2;
import pkg1.Test;
public class Tester {
public static void main(String... args) {
Test.meth();
}
}
打印:
Hello 111 Hello 222
所以,仅仅因为你导入了一个类并不意味着类加载器会将类加载到内存中。它在使用时动态加载。
答案 1 :(得分:3)
我没有声称对类加载器有很多了解,但是如果你在谈论import语句,那么类加载器是无关紧要的。
导入语句纯粹是为了允许开发人员使用短类名而不是正在编写的类中引用的每个类的完全限定名。编译器很早就使用这些import语句在创建一行字节码之前解析引用类的名称。
答案 2 :(得分:1)
通常,带有报告(即打印语句)的类文件顶部的静态代码块可以让您很好地了解在特定应用程序中何时进行加载。
但是,在处理极端情况时,例如动态类,内部静态类或动态加载的类路径中的类,您必须要小心 - 因为这些类实际上可能在应用程序中加载了多次。 / p>