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

标签 java class jvm classloader

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

相关文章:

java - setMultiChoiceItems 单击时 IndexOutOfBoundsException

java - @Resource 注释成员未注入(inject) - 错误代码或错误?

java - 如何在 Java 中使用 for 循环从类创建新对象?

class - UML中的类和分类器有什么区别

java - 在函数重载的情况下,JVM 如何找到要调用的方法(具有最接近匹配的参数)

java - Gson 不序列化子类中定义的字段

java - 在 json java 中切换值

javascript - 我们可以删除 ES6 类吗?

java - Jave 如何防止并发类初始化发生?

elasticsearch - 如何从正在运行的 JVM 中捕获堆转储