【问题标题】:how to get a class with forName() in a different package?如何在不同的包中获取带有 forName() 的类?
【发布时间】: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 包中。它仍然会工作。它在类加载器知道的任何地方都可以看到。

标签: java class package


【解决方案1】:

这就是问题所在:

java -cp src -jar FooJar.jar

来自java tool documentation

使用 -jar 选项时,指定的 JAR 文件是所有用户类的来源,其他类路径设置将被忽略。

尝试运行它:

java - cp src;FooJar.jar foo.Whatever

(其中foo.Whatever 是包含main 方法的类的完全限定名称)。

【讨论】:

  • 我试图访问的类的主要方法?因为jar文件也包含一个?
  • @Shed:您尝试运行的类中的主要方法——这将是 jar 文件中的方法。您希望 JVM 启动的入口点。
  • 哦,当我单击它时,jar 会自动转到我的主类,因为我已在清单文件中指定它。我正在尝试访问 jar 之外的类
  • @Shed:是的,但这就是我引用的文档的相关之处——如果您使用该引导机制,其他类路径选项将被忽略。当然,您可以在应用程序中创建自己的ClassLoader……但这可能需要更多的工作。希望现在已经相当清楚 - 如果您需要更多建议,我建议您提出一个新问题。
  • 我终于弄明白了,非常感谢您对我的耐心。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-07
相关资源
最近更新 更多