Java - 为什么此输入不生成 ClassNotFoundException

Java - why does this input not generate ClassNotFoundException

当我使用反射时,我遇到了这个错误。我有一个名为 Test1 的 class,当我尝试通过输入 test1 作为 Class.forName() 的输入来获取它的 Class 对象时,它会生成 LinkageError 而不是 ClassNotFoundException .为什么小写字母会混淆程序并阻止它生成通常的 ClassNotFoundException,例如 "sjghdjgh"?

最小示例

主要

public class Main {
    public static void main(String[] args) {
        try {
            Class.forName("test1");
        }
        catch (ClassNotFoundException cnfe) {
            System.out.println(cnfe.toString());
        }
        catch (LinkageError le) {
            System.out.println(le.toString());
        }
    }
}

测试 1

public class Test1 {
}

如果你向某些文件系统询问 test1.class,他们会给你一个 Test1.class 而不是找不到文件(因为它们不区分大小写)然后 class 文件不包含名为 test1 的 class,而是包含 Test1(Java class 名称区分大小写),因此 class加载程序错误。

这在实践中很少成为问题,因为大多数应用程序都是使用 Jar 文件部署的(因此文件系统中的 classes 没有单独的文件)。