4

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

4

2 回答 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 reloadB.class 但PermGen直接从中获取,否则 JVM 将递归加载 B.class。

当 JVM 找不到 B.class 时,它会抛出NoClassDefFoundError.

在 [Java 规范]:第 319 页中查看有关 NoClassDefFoundError 的更多信息

于 2012-09-26T13:41:26.120 回答