我尝试搜索如何从 Java 包中访问不在指定包中的文件,但无法找到答案。有谁知道怎么做?
3 回答
如果您的意思是要从命名包访问默认(未命名)包中的 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");
你不能没有反思。
真的不鼓励使用“默认包”(根本没有包),这是阻止它的原因之一。
“默认”包实际上是根目录。使用绝对路径:
URL url = getClass().getResource("/myphoto.jpg");
InputStream in = getClass().getResourceAsStream("/myphoto.jpg");
使用 7zip/WinZip 等打开创建的 jar。您应该在根目录中看到该文件。