我不清楚以下几点:
JVM在需要时加载一个类,比如延迟初始化,对吧?
现在,如果类做A
了一个实际上不在文件系统中的类(例如import
被删除或未交付或任何原因) ,
那么如果没有调用类的方法,类会被加载并运行吗?或者由于导入无法解决,类根本无法运行?或者类被加载并运行到某个点? B
B
B.class
A
B
A
A
问问题
291 次
2 回答
7
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
或类似的。
于 2012-09-26T07:21:35.703 回答
0
如果 A.class 需要缺少 B.class。A.class 无法加载。
加载类是一个recursion operation
.
当 A.class 需要 B.class 时,JVM 在 .class 中搜索 B.class PermGen
。如果 B.class 被加载并存储在 中PermGen
,JVM 将not reload
B.class 但PermGen
直接从中获取,否则 JVM 将递归加载 B.class。
当 JVM 找不到 B.class 时,它会抛出NoClassDefFoundError
.
于 2012-09-26T13:41:26.120 回答