我尝试搜索如何从Java中的包中访问不在指定包内的文件,但无法找到答案。有谁知道怎么做?
答案 0 :(得分: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平台提供了未命名的软件包,主要是为了方便开发小型或临时应用程序或刚开始开发时。”
这意味着你应该仅使用/一个未命名的软件包用于小型/临时应用程序(或作为止损),并转而使用命名软件包来处理任何严重的问题。
如果您想要访问未命名包中的FILE(例如资源),那么您只需要在资源名称的前面加上斜杠; e.g。
InputStream is = classLoader.getResourceAsStream("/someresource");
答案 1 :(得分:0)
你不能没有反思。
真的不鼓励使用'默认包'(根本没有包),这是阻止它的一种方法。
答案 2 :(得分:0)
“default”包实际上是根目录。使用绝对路径:
URL url = getClass().getResource("/myphoto.jpg");
InputStream in = getClass().getResourceAsStream("/myphoto.jpg");
用7zip / WinZip等打开创建的jar。您应该在根目录中看到该文件。