原文:http://swiftlet.net/archives/868

在Java中获取资源的时候,经常用到Class.getResource和ClassLoader.getResource,本文给大家说一下这两者方法在获取资源文件的路径差异。
Class.getResource(String path)
path不以'/'开头时,默认是从此类所在的包下取资源;path以'/'开头时,则是从项目的ClassPath根下获取资源。在这里'/'表示ClassPath
JDK设置这样的规则,是很好理解的,path不以'/'开头时,我们就能获取与当前类所在的路径相同的资源文件,而以'/'开头时可以获取ClassPath根下任意路径的资源。
如下所示的例子:

1
2
3
4
5
6
7
8

public class Test
{
    public static void main(String[] args)
    {
        System.out.println(Test.class.getResource(""));
        System.out.println(Test.class.getResource("/"));
    }
}

运行结果为:
file:/D:/work_space/java/bin/net/swiftlet/
file:/D:/work_space/java/bin/

Class.getClassLoader().getResource(String path)
path不能以'/'开头时,path是指类加载器的加载范围,在资源加载的过程中,使用的逐级向上委托的形式加载的,'/'表示Boot ClassLoader中的加载范围,因为这个类加载器是C++实现的,所以加载范围为null。如下所示:

1
2
3
4
5
6
7
8

public class Test
{
    public static void main(String[] args)
    {
        System.out.println(Test.class.getClassLoader().getResource(""));
        System.out.println(Test.class.getClassLoader().getResource("/"));
    }
}

运行结果为:
file:/D:/work_space/java/bin/
null
从上面可以看出:
class.getResource("/") == class.getClassLoader().getResource("")
其实,Class.getResource和ClassLoader.getResource本质上是一样的,都是使用ClassLoader.getResource加载资源的。下面请看一下jdk的Class源码:

1
2
3
4
5
6
7
8
9
10
11

  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);
    }

从上面就可以看才出来:Class.getResource和ClassLoader.getResource本质上是一样的。至于为什么Class.getResource(String path)中path可以'/'开头,是因为在name = resolveName(name);进行了处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

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;
    }

转载于:https://www.cnblogs.com/Dhouse/p/5945859.html

Class.getResource和ClassLoader.getResource的区别分析相关推荐

  1. Class.getResource和ClassLoader.getResource

    一案例驱动 二源码分析 三类加载器ClassLoader 四总结 五参考 一案例驱动 最近加载文件的时候遇到了一个问题,很有意思! 具体看下面案例代码 public class TestClassLo ...

  2. 关于Class.getResource和ClassLoader.getResource的路径问题

    本文转自:http://www.cnblogs.com/yejg1212/p/3270152.html Java中取资源时,经常用到Class.getResource和ClassLoader.getR ...

  3. Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()解析

    this.class.getClassLoader()解析 java是面向对象语言,面向对象的语言的宗旨就是万事万物皆对象,那么类.类里面的属性和方法都是对象.java里面的所有的类都是Class类的 ...

  4. Class的getResource与ClassLoader的getResource路径/问题

    一.Class的getResource(String path):URL 1.path 不以'/'开头时,默认是从此类所在的包下取资源: 2.path 以'/'开头时,则是从ClassPath根下获取 ...

  5. class.getResources与ClassLoader.getResources的区别

    class.getResources与ClassLoader.getResources有不同的访问途径,如果访问方式不对,只会得到null值. Maven工程目录如下 如上图,编译后,maven会将s ...

  6. RADAR和LIDAR区别分析

    RADAR和LIDAR区别分析 如果一直关注自动驾驶汽车的新闻,可能已经注意到许多自动驾驶汽车制造商正在使用LIDAR(光成像检测和测距)进行车载物体检测.对于许多自动 驾驶汽车应用而言,LIDAR比 ...

  7. sql语句中left join和inner join中的on与where的区别分析

    原文:sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用 ...

  8. c语言中 char怎样用,C语言中char*和char[]用法区别分析

    C语言中char*和char[]用法区别分析 本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很 ...

  9. mysql数据库varchar的区别_MySQL数据库char与varchar的区别分析及使用建议

    在数据库中,字符 型的数据是最多的,可以占到整个数据库的80%以上.为此正确处理字符型的数据,对于提高数据库的性能有很大的作用.在字符型数据中,用的最多的就是 Char与Varchar两种类型.前面的 ...

最新文章

  1. access open 知乎_NX使用——远程IDE利器
  2. leetcode算法题--扁平化多级双向链表★
  3. android 让item满屏,Android的全屏活动?
  4. 【亚马逊AWS】入门级别实践
  5. 自用零散博文-route_state.ts
  6. 一个较好的基础的数据库连接池知识
  7. dx绘制2d图像_【3D建模】聊聊2D动画软件
  8. C++:显示每年的各月份第一天是星期几
  9. python更换证件照底色
  10. Excel通过图片名插入图片
  11. 看完书就忘,怎么办?告诉你六种方法(转载)
  12. BIRD 与 BGP 的新手开场 --转
  13. 大数据应用技术实验报告五 NoSQL
  14. CeSharp107.1.4升级物联网浏览器
  15. 解决ijkplayer和阿里云播放器冲突的解决
  16. CSS颜色代码大全及a标签超链接颜色改变
  17. 光华股份深交所上市:市值51亿 应收账款余额超5亿
  18. 记录2015年年初跳槽的经历!
  19. 盘一盘!实时自动驾驶车辆定位技术都有哪些?(视觉/Lidar/多传感器数据融合)...
  20. “远程办公”用户达3.46亿,一年每人可节省1.4万

热门文章

  1. linux类似360软件,linux下有什么类似鲁大师查看电脑配置的软
  2. cx_oracle写日志信息_看日志痛苦——可能是你方法不对
  3. python去除图像光照不均匀_CVPR 2020 | 从重建质量到感知质量:用于低光照增强的半监督学习方法...
  4. 光端机与光电转换器的区别介绍
  5. 工业交换机和工业4G路由器的区分
  6. [渝粤教育] 西南科技大学 西方经济学 在线考试复习资料
  7. 国家开放大学2021春1080工程数学(本)题目
  8. 【渝粤教育】广东开放大学 动画原画设计 形成性考核 (22)
  9. LoRaWAN 巩固了其作为低功耗广域网主导技术的地位
  10. 表示微型计算机系统稳定性,计算机基础知识(三)135