JVM何时加载类?

Gar*_*all 19 java reflection jvm classloader

假设我有以下课程:

class Caller {
  public void createSomething() {
    new Something();
  }
}
Run Code Online (Sandbox Code Playgroud)

会执行这一行:

static void main() {
   Class<?> clazz = Caller.class;
}
Run Code Online (Sandbox Code Playgroud)

导致JVM加载类Something或者是在createSomething()调用方法之前延迟的类加载?

Mat*_*ell 24

只有在需要有关该类的信息时才会加载类.

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
    }
}
Run Code Online (Sandbox Code Playgroud)

第(2)和(3)行将导致类被加载.Something.class对象包含只能来自类定义的信息(第(2)行),因此您需要加载该类.对构造函数(3)的调用显然需要类定义.类似于课堂上的任何其他方法.

但是,line(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 {}
Run Code Online (Sandbox Code Playgroud)

此代码不会导致加载Something.class.但是,如果我调用doSomething(),则会加载该类.要对此进行测试,请创建上述类,编译它们并删除Something.class文件.上面的代码不会因ClassNotFoundException而崩溃.

  • 我不认为这是正确的(2) - Java 8.我可以指定`Class <?> k = Foo.class;`并获得一个具有类型名称但它没有执行任何静态的Class实例班上的街区. (4认同)