当前位置: 首页 > 面试题库 >

使用ClassLoader加载文件

许淳
2023-03-14
问题内容

这个问题困扰了我一段时间。我必须在我的Java应用程序中加载几个文件,到目前为止,我工作的唯一方式是这样的:

URL hsURL;
if(System.getProperty("os.name").toLowerCase().contains("windows")) {
    hsURL = new URL("file:/" + System.getProperty("user.dir") + "/helpsets/helpset.hs");
}
else {
    hsURL = new URL("file://" + System.getProperty("user.dir") + "/helpsets/helpset.hs");
}

但这是丑陋和可怕的。有一阵子我以为我在做这个工作:

hsURL = ClassLoader.getSystemResource("helpsets/helpset.hs");

但这由于某种原因不再起作用(我必须做些更改并且没有注意到。它返回null。

我应该使用getResource()而不是getSystemResource()(如果这样),为什么getSystemResource()是静态的却不是getResource()呢?

我正在使用eclipse,并且尝试将文件夹包含在构建路径(classpath)中,但不包括它,这似乎没有什么不同。


问题答案:

getSystemResource是静态的,因为它将使用 系统
类加载器,该类加载器是静态可用的。(ClassLoader.getSystemClassLoader

如果您的资源在类路径中可用,我建议您使用ClassLoader.getResource()Class.getResource从适当的类中获取资源,例如

Foo.class.getResource("/helpsets/helpset.hs");

ClassLoader.getResource是“绝对的”;Class.getResource相对于类的包,除非您在其前面加上“ /”。)

如果这不起作用,请按照类路径以及文件所在位置发布如何配置您的应用。

编辑:我通常发现URL的作用不及InputStream,因此我使用getResourceAsStream代替getResource。青年汽车



 类似资料:
  • CLMAIN->clA(类A,$B)。$B是类a的内部类B。 从clMain创建具有指定url的新clA到包含类A(和类$B)的jar文件。然后通过CLA创建新对象A。 从X加载的另一个类通过接口执行对象a的方法没有问题。 然后,在该方法中,应该创建新对象$b,但它抛出. 在类A的构造函数中加载类$B可以解决以下问题:

  • 问题内容: 以下是2个代码段 第一个使用ClassLoader类加载指定的类 第二个使用Class.forName()加载指定的类 上述方法之间有何区别?哪一个服务于哪个目的? 问题答案: 快速解答(无代码示例) 使用显式方法,您可以灵活地从 不是 默认ClassLoader的ClassLoader中加载类。在你的情况下,你使用的是默认系统类加载器,所以它提供了类似的总体结果(与最终目标的差异的实

  • 我有一个nio通道,我的客户机应该从服务器计算机加载一个类文件。它们在相同的IP范围内。我有两个在服务器和客户机上通用的接口。以及在服务器计算机上实现接口的类。我在我的客户机上使用以下代码,但运行时将出现ClassNotFoundException。 这种情况下类加载的完整过程是什么?

  • 问题内容: 如果我有一个内部类声明,例如: 其次是: A $ B内部类也将被加载吗?如果B内部类未声明为“静态”怎么办? 问题答案: 一旦代码被编译, 就没有内部类之类的东西 。如果查看的结果,则会看到两个文件: 因此,类在加载时不会加载,只是 碰巧 在中定义了。 编辑 例如,鉴于这两个文件, 和一个文件(为方便起见): 首先,通过运行进行构建。然后,解压缩生成的JAR文件(位于中): 打开每个文

  • 问题内容: 我有一个加载从源文件编译的类。但是,当我更改源文件,保存并重新编译它时,仍然会加载该类的第一个版本。 我想念什么?像newInstance之类的东西? 问题答案: 类加载器不能替换已经加载的类。将返回现有实例的引用。 您必须实例化一个新的类加载器,并使用它来加载新类。然后,如果要“替换”该类,则必须扔掉该类加载器并创建另一个新的类加载器。 针对您的评论:做类似的事情 该类加载器将使用“

  • 问题内容: 我正在寻找编写一个自定义类加载器,它将通过自定义网络加载文件。最后,我要做的只是文件的字节数组。 我无法将字节数组转储到文件系统上并使用。 我的第一个计划是从流或字节数组创建对象,但它仅支持对象。 我已经写了一些使用的东西: 这对于小型文件可能很好用,但是我尝试加载包含几乎所有类的jar文件,它只是为了遍历所有条目而已,更不用说加载找到的类了。 如果有人知道一个解决方案比每次加载类都遍