在我的主要内容中,我有以下声明
Class booki = Class.forName("Book");
会引发java.lang.ClassNotFoundException
异常
当我使用像Class booki = Class.forName("javatests.Book");
这样的完整路径时,没关系。
主类和Book类在同一个包中,我也尝试使用import static javatests.Book.*;
但如果我没有设置完整路径javatests.Book
,它仍然会引发异常。有人可以向我解释原因吗?
答案 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环境变量指定的目录树根集;显然它不知道它被称为的地方(包)。这就是它需要完全限定名称的原因。