我不清楚以下几点:
一个类在需要时由 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/