为什么要使用类加载器来读取资源

gab6jxml  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(606)

我遇到了一个需要使用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。我们不能直接读取路径中的内容吗?我猜这可能与加载资源的时间有关。

bxpogfeg

bxpogfeg1#

项目由两部分组成:
编译成.class文件的代码
资源(任何文件,如属性、xml…)
然后打包。 Package 主要有:
一个jar
目录
类加载器能够访问打包的项目(jar、目录…)。主类加载器正在访问类路径中指定的jar和目录,但是可以在运行时添加额外的类加载器。例如,在可以在运行时部署新打包应用程序的应用程序服务器上,将为每个应用程序创建一个类加载器。
这就是为什么要从打包的项目中访问resources,您需要使用classloader(甚至resources的名称也不清楚)。如果要访问与类一起打包在同一项目中的ressource,可以获得类的classloader,这样就可以确保它可以访问同一项目的ressource。
最典型的类加载器是java.net.urlclassloader,它获取一个url列表(本地或远程jar、目录…),例如类路径,并查看每个url以搜索.class文件或资源文件。
总之,您可以将类加载器视为搜索文件的位置列表,可以是加载类的.class,也可以是作为资源的任何其他类型的文件。

相关问题