Class.getResource VS ClassLoader.getResource

39 篇文章 0 订阅

    今天在写代码的时候遇到了一个坑,内容如标题,特此记录一下,废话不多说,先看代码。

    首先看看Class.getResource方法:

    public java.net.URL getResource(String name) {
        name = resolveName(name);
        ClassLoader cl = getClassLoader0();
        if (cl==null) {
            // A system class.
            return ClassLoader.getSystemResource(name);
        }
        return cl.getResource(name);
    }
    请注意:在方法的第一行有一个resolveName方法,这个方法就是class.getResource和classLoader.getResource的区别。

    ClassLoader.getResource方法:

    public URL getResource(String name) {
        URL url;
        if (parent != null) {
            url = parent.getResource(name);
        } else {
            url = getBootstrapResource(name);
        }
        if (url == null) {
            url = findResource(name);
        }
        return url;
    }
这也说明了Class.getResource获取资源默认是相对路径,如果要获取根目录资源则资源名称需要“/”打头,而ClassLoader.getResource获取的就是根路径资源,原因就是因为Class.resolveName方法是这样写的:

   private String resolveName(String name) {
        if (name == null) {
            return name;
        }
        if (!name.startsWith("/")) {
            Class<?> c = this;
            while (c.isArray()) {
                c = c.getComponentType();
            }
            String baseName = c.getName();
            int index = baseName.lastIndexOf('.');
            if (index != -1) {
                name = baseName.substring(0, index).replace('.', '/')
                    +"/"+name;
            }
        } else {
            name = name.substring(1);
        }
        return name;
    }
    可见如果我们要加载录资源文件使用Class.getResource的话,他会将根路径中"/"处理一下然后,然后交给ClassLoader去加载。

    总结的结论:

        1. Class.getResource方法加载的资源文件路径为相对路径,如果要加载根路径资源需要以"/"  打头。

        2. ClassLoader.getResource方法加载的资源文件路径为根路径,不能使用相对路径加载资源文件,所以如果要加载根路径资源,资源名称不能以“/”打头。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值