gpt4 book ai didi

java - 如果无法解析 import 语句会怎样?

转载 作者:搜寻专家 更新时间:2023-11-01 01:54:54 24 4
gpt4 key购买 nike

我不清楚以下几点:
一个类在需要时由 JVM 加载,就像延迟初始化一样,对吧?
现在,如果 A 类对 B 类执行 import,那么 B 类实际上不在文件系统中(例如B.class 已被删除或未交付或任何原因)
那么 A 类是否被加载并运行 如果 没有类 B 的方法被调用?
或者A 根本无法运行,因为无法解析导入?
或者A被加载并运行到某个点?

最佳答案

import 语句只对编译器重要。在字节码中,所有对其他类的引用都是完全限定的。这就是为什么在运行时多余的导入无关紧要。

在您的情况下,JVM 将尝试加载加载和验证 A 所需的所有类,因此它将尝试立即加载 B,但依赖类仅在需要时才延迟加载。查看以下示例:

public class A {

public static void bar() {
new B().foo();
}

public static void main(String[] args) {
//bar();
}

}

编译A.java,删除B.class。如果不调用 bar() 方法,您的程序将运行良好。但是一旦你取消注释一段实际使用 B 类的代码,你就会变得很讨厌:

Exception in thread "main" java.lang.NoClassDefFoundError: B
at A.bar(A.java:4)
at A.main(A.java:8)
Caused by: java.lang.ClassNotFoundException: B
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
... 2 more

如果 B 不可用,您将得到 NoClassDefFound 或类似的。

关于java - 如果无法解析 import 语句会怎样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12596527/

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