Jim*_*Jim 4 java jvm class classloader
我不清楚以下内容:
JVM在需要时加载一个类,比如延迟初始化,对吧?
现在,如果类A做一个import类的B哪一类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();
}
}
Run Code Online (Sandbox Code Playgroud)
编译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
Run Code Online (Sandbox Code Playgroud)
如果B没有,你会得到NoClassDefFound或类似.