【问题标题】:java.lang.ClassNotFoundException for a specified class指定类的 java.lang.ClassNotFoundException
【发布时间】:2013-10-30 06:16:25
【问题描述】:

在我的主要内容中,我有以下声明

Class booki = Class.forName("Book");

引发java.lang.ClassNotFoundException 异常

当我使用像Class booki = Class.forName("javatests.Book"); 这样的完整路径时,没关系。

主类和Book类在同一个包中,我也尝试过使用import static javatests.Book.*;,但如果我没有设置完整路径javatests.Book,它仍然会抛出异常。谁能给我解释一下为什么?

【问题讨论】:

  • 如果 Book 是一个类,那么为什么 Book.*
  • 因为是static import
  • @Bart 我没有注意到它是静态导入,抱歉
  • 它在 Javadocs 中提到 for, public static Class> forName(String className) : className - 所需类的完全限定名。

标签: java classnotfoundexception


【解决方案1】:

Class.forName 将完全限定的类名解析为类。由于方法不知道从哪里调用它,既不知道调用类的包,也不知道调用类中的imports 起任何作用。

【讨论】:

    【解决方案2】:

    来自文档Class#forName

     public static Class<?> forName(String className)
                        throws ClassNotFoundException
    

    参数:
    className - 所需类的完全限定名。

    所以这不会抛出ClassNotFoundException

    Class booki = Class.forName("javatests.Book");  
    

    例如,在java程序中不需要导入java.lang.*包,而是从java.lang包中加载类Thread需要编写

    Class t = Class.forName("java.lang.Thread");
    

    上面的代码片段返回了名为java.lang.Thread的类的运行时类描述符

    【讨论】:

      【解决方案3】:

      你总是需要一个合格的类名除非它在同一个包中。如果我在我的包中定义了一个类 foo,我可以调用一个方法 Class testClass = Class.forName("foo"),但即使我导入 SecureRandom,我也不能调用 Class testClass = Class.forName("SecureRandom");。这就是函数的工作原理。它可能有一个快捷方式,可以尝试在本地包中查找内容,但在此之后并没有做太多事情。

      【讨论】:

        【解决方案4】:

        首先,Book 类必须在 javatests 包中。
        JVM 通过类路径按名称加载类。 类路径中没有名为“Book”的类。 所以当借口 Class.forName("Book") 时,JVM 会给你一个 ClassNotFoundException。 但是 'Class.forName("javatests.Book")' 告诉 JVM 名为 'Book' 的类在包 'javatests' 中。 所以JVM可以找到并加载它。

        希望我的回答对你有帮助:)

        【讨论】:

          【解决方案5】:

          JLS 提供以下描述:

          类查找始终代表引用类,并通过ClassLoader 的实例完成。给定类的完全限定名称,此方法会尝试定位、加载和链接该类。

          JDK 使用ClassLoader 的一个实例来搜索由 CLASSPATH 环境变量指定的目录树根集;显然它不知道它被调用的地方(包)。这就是它需要完全限定名称的原因。

          【讨论】:

            猜你喜欢
            • 2014-07-23
            • 2017-07-30
            • 1970-01-01
            • 2014-11-28
            • 1970-01-01
            • 2016-01-30
            • 2021-08-30
            • 2019-05-11
            • 2018-04-04
            相关资源
            最近更新 更多