
仅当您需要有关该类的信息时才加载该类。
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而崩溃。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)