10

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

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

抛出java.lang.ClassNotFoundException异常

当我使用完整路径时,就可以了Class booki = Class.forName("javatests.Book");

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

4

5 回答 5

12

Class.forName将完全限定的类名解析为类。由于方法不知道从哪里调用它,因此调用类的包和调用类import中的 s 都不起作用。

于 2013-10-30T06:22:57.740 回答
3

来自文档类#forName

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

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

所以这不会抛出ClassNotFoundException

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

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

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

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

于 2013-10-30T06:24:53.730 回答
0

JLS 提供以下描述:

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

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

于 2013-10-30T06:42:38.907 回答
0

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

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

于 2013-10-30T06:38:37.190 回答
0

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

于 2013-10-30T06:25:24.320 回答