gpt4 book ai didi

java - JVM 什么时候加载类?

转载 作者:IT老高 更新时间:2023-10-28 21:00:26 25 4
gpt4 key购买 nike

假设我有以下类(class):

class Caller {
public void createSomething() {
new Something();
}
}

将执行此行:

static void main() {
Class<?> clazz = Caller.class;
}

导致 JVM 加载类 Something 还是类加载延迟到方法 createSomething() 被调用?

最佳答案

仅当您需要有关该类的信息时才加载该类。

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 而崩溃。

关于java - JVM 什么时候加载类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7560721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com