指定类的java.lang.ClassNotFoundException

时间:2013-10-30 06:16:26

标签: java classnotfoundexception

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

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

会引发java.lang.ClassNotFoundException异常

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

主类和Book类在同一个包中,我也尝试使用import static javatests.Book.*;但如果我没有设置完整路径javatests.Book,它仍然会引发异常。有人可以向我解释原因吗?

5 个答案:

答案 0 :(得分:10)

Class.forName为该类解析了一个完全限定的类名。由于方法不知道调用类的包,调用类的包和调用类中的import都不起作用。

答案 1 :(得分:2)

来自文档Class#forName

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

<强>参数:
className - 所需类的完全限定名称。

所以这不会抛出ClassNotFoundException

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

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

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

上面的代码片段返回名为java.lang.Thread

的类的运行时类描述符

答案 2 :(得分:0)

您总是需要一个合格的班级名称,除非它在同一个包中。如果我在我的包中定义了一个类foo,我可以调用方法Class testClass = Class.forName("foo"),但即使我导入SecureRandom,我也无法调用Class testClass = Class.forName("SecureRandom");。这就是函数的工作原理。它可能有一个快捷方式,它试图在本地包中找到东西,但在这背后没有做太多。

答案 3 :(得分:0)

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

我希望我的回答很有帮助:)

答案 4 :(得分:0)

JLS提供以下描述:

  

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

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