只有当您需要有关该类的信息时,才会加载类。
public class SomethingCaller {
public static Something something = null; // (1) does not cause class loading
public static Class> somethingClass = Something.class; // (2) causes class loading
public void doSomething() {
new Something(); // (3) causes class loading
}
}
线(2)& (3)将导致类被加载。 Something.class对象包含信息(行(2)),它只能来自类定义,因此需要加载类。对构造函数(3)的调用显然需要类定义。类似于类上的任何其他方法。
但是,行(1)不会导致类被加载,因为您实际上不需要任何信息,它只是对对象的引用。
编辑:在你改变的问题,你询问是否引用Something.class加载类。是的,它确实。它不会加载类,直到执行main()。使用以下代码:
public class SomethingTest {
public static void main(String[] args) {
new SomethingCaller();
}
}
public class SomethingCaller {
public void doSomething() {
Class> somethingClass = Something.class;
}
}
public class Something {}
此代码不会导致加载Something.class。但是,如果我调用doSomething(),则加载该类。要测试这个,创建上述类,编译它们并删除Something.class文件。上述代码不会与ClassNotFoundException崩溃。