0

我尝试搜索如何从 Java 包中访问不在指定包中的文件,但无法找到答案。有谁知道怎么做?

4

3 回答 3

1

如果您的意思是要从命名包访问默认(未命名)包中的 CLASS,则不能。JLS 是这样说的:

“未命名包中的类型(第 7.4.2 节)没有规范名称,因此每种导入声明中对规范名称的要求意味着(a)无法导入未命名包中的类型,以及(b)静态无法导入未命名包中的类型成员。因此,第 7.5.1 节、第 7.5.2 节、第 7.5.3 节和第 7.5.4 节在任何尝试导入类型时都需要编译时错误(或其静态成员)在一个未命名的包中。”

这意味着您不能使用单一类型的导入。并且“通配符”导入将不起作用,因为您无法命名包。

是的,您可以通过使用反射来解决此限制,但它非常麻烦,并且会使您的代码变得缓慢和脆弱。如果您想了解 Java 中的反射,请从这里开始 - http://docs.oracle.com/javase/tutorial/reflect/index.html。但这不是解决这个“问题”的好方法。

正确的解决方案是使用包……正如 Java 语言设计者所期望的那样。JLS 是这样说的:

“Java SE 平台提供了未命名的包,主要是为了在开发小型或临时应用程序或刚开始开发时方便。”

这意味着您应该将 / 一个未命名的包用于小型/临时应用程序(或作为权宜之计),而对于任何严重的事情都应该使用命名包。


如果您的意思是要访问未命名包中的文件(例如资源),那么您只需在资源名称前面加上一个斜杠即可;例如

      InputStream is = classLoader.getResourceAsStream("/someresource");
于 2012-12-30T00:43:51.750 回答
0

你不能没有反思。

真的不鼓励使用“默认包”(根本没有包),这是阻止它的原因之一。

于 2012-12-30T00:19:03.157 回答
0

“默认”包实际上是根目录。使用绝对路径:

URL url = getClass().getResource("/myphoto.jpg");
InputStream in = getClass().getResourceAsStream("/myphoto.jpg");

使用 7zip/WinZip 等打开创建的 jar。您应该在根目录中看到该文件。

于 2012-12-30T00:36:12.300 回答