【问题标题】:Why use a ClassLoader to read a resource为什么使用 ClassLoader 读取资源
【发布时间】:2020-12-11 00:23:34
【问题描述】:

我遇到了需要使用ClassLoader的情况:

我有一个 XML 文件,它指定了 sql 的配置细节,我想将它加载到一个配置类中。第一步是将 XML 中的内容加载到 Inputstream 中。

public class Resources{
    public static InputStream getResourceAsStream(String path){
        InputStream resourceAsStream = Resources.class.getClassLoader().getResourceAsStream(path);
        return resourceAsStream;
    }
}

我只是模糊地知道什么是类加载器:它将类加载到 JVM 中。我完全不清楚为什么要在这里使用 classLoader。我们不能直接读取路径中的内容吗?我的猜测是,这可能与人们想要加载资源的时间有关。

【问题讨论】:

  • “路径”的一个问题是许多 Java 程序被设计为在 Internet 上使用(有点遗憾的是,由浏览器执行的 Java Applet 不再是一个东西了)。 “路径”可能不存在,资源可能位于其他人的服务器上。因此,如果您实际上是下载此文件而不是“读取路径”,则需要一点间接性。
  • 只是跟进您的评论:如果我们有一些资源位于其他人的服务器中,我们应该如何指定类路径?
  • 你没有。类加载器知道从哪里加载数据(包括类)。例如,在小程序的特定情况下,从 HTML 页面读取路径并在代码开始执行之前将其分配给类加载器。

标签: java


【解决方案1】:

一个项目由两部分组成:

  • 编译成.class文件的代码
  • 资源(任何文件,例如属性、xml...)

然后打包。包装可以主要是:

  • 一个罐子
  • 一个目录

ClassLoader 能够访问打包的项目(jar、目录...)。主 ClassLoader 正在访问类路径中指定的 jar 和目录,但可能会在运行时添加额外的 ClassLoader。例如,在应用服务器上,您可以在运行时部署新的打包应用程序,为每个应用程序创建一个 ClassLoader。

这就是为什么,要从打包的项目中访问资源,您需要使用 ClassLoader(即使资源的名称也不清楚)。 如果你想在同一个项目中访问与你的类一起打包的资源,你会得到你的类的ClassLoader,这样你就可以确定它可以访问同一个项目的资源。

最典型的 ClassLoader 是 java.net.URLClassLoader,它获取 URL 列表(本地或远程 JAR、目录...),例如类路径,并查看每个 URL 以搜索 .class 文件或资源文件.

总而言之,您可以将 ClassLoader 视为搜索文件的位置列表,可以将 .class 用于加载类,也可以将任何其他类型的文件视为资源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-22
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2020-02-08
    • 1970-01-01
    • 2011-05-23
    相关资源
    最近更新 更多