【发布时间】:2014-10-06 15:17:08
【问题描述】:
好吧,考虑下面的例子:
inside of the src/ folder, i have the following packages :
org/
com/
Foo 类位于 org.somepackage;
Class Doo 位于 com.apackage;
Foo 需要使用 Class.forName();
访问 Doo如果我尝试使用 Class.forName("com.apackage.Doo");
我得到 ClassNotFoundException,因为它们位于不同的包中。
Foo 如何在这个层次结构中访问 Doo?
编辑
这里有更多背景:
完整的询问信息:
这是我的批处理文件、jar 文件和包含我试图访问的文件的 src 文件。
这是 src 文件中的类:
这是我的批处理文件:
现在当我尝试访问文件 Doo 时,这是错误:
干杯。
【问题讨论】:
-
你的意思是类
Doo位于包com.apackage中吗?当然,它的包也不包括Doo。但是如果完整的类名是com.apackage.Doo,那么Class.forName应该没问题——我猜你的类路径是错误的。 -
对。所以我可以向你保证
Class.forName确实 可以跨包工作......所以我的猜测是类加载器不知道Doo。你是如何运行这段代码的?你能给出一个简短但完整的例子来说明你是如何构建和运行它的吗? -
看起来最有可能的问题是类加载器无法找到该类。我最好的猜测是类路径不包含所需类的 jar 或作为类的基目录的目录。
-
@Shed:这不是 jar 文件。它是类加载器。如果类加载器能够访问该类,则包无关紧要。
-
@Shed:不,这是完全限定的类名。查看文档中的示例:
Class.forName("java.lang.Thread")。从您的代码中尝试,该代码不在java.lang包中。它仍然会工作。它在类加载器知道的任何地方都可以看到。