Class.getResource和ClassLoader.getResource的区别分析
原文: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的区别分析相关推荐
- Class.getResource和ClassLoader.getResource
一案例驱动 二源码分析 三类加载器ClassLoader 四总结 五参考 一案例驱动 最近加载文件的时候遇到了一个问题,很有意思! 具体看下面案例代码 public class TestClassLo ...
- 关于Class.getResource和ClassLoader.getResource的路径问题
本文转自:http://www.cnblogs.com/yejg1212/p/3270152.html Java中取资源时,经常用到Class.getResource和ClassLoader.getR ...
- Class.getResource()、ClassLoader.getResource()和this.class.getClassLoader()解析
this.class.getClassLoader()解析 java是面向对象语言,面向对象的语言的宗旨就是万事万物皆对象,那么类.类里面的属性和方法都是对象.java里面的所有的类都是Class类的 ...
- Class的getResource与ClassLoader的getResource路径/问题
一.Class的getResource(String path):URL 1.path 不以'/'开头时,默认是从此类所在的包下取资源: 2.path 以'/'开头时,则是从ClassPath根下获取 ...
- class.getResources与ClassLoader.getResources的区别
class.getResources与ClassLoader.getResources有不同的访问途径,如果访问方式不对,只会得到null值. Maven工程目录如下 如上图,编译后,maven会将s ...
- RADAR和LIDAR区别分析
RADAR和LIDAR区别分析 如果一直关注自动驾驶汽车的新闻,可能已经注意到许多自动驾驶汽车制造商正在使用LIDAR(光成像检测和测距)进行车载物体检测.对于许多自动 驾驶汽车应用而言,LIDAR比 ...
- sql语句中left join和inner join中的on与where的区别分析
原文:sql语句中left join和inner join中的on与where的区别分析 关于SQL SERVER的表联接查询INNER JOIN .LEFT JOIN和RIGHT JOIN,经常会用 ...
- c语言中 char怎样用,C语言中char*和char[]用法区别分析
C语言中char*和char[]用法区别分析 本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很 ...
- mysql数据库varchar的区别_MySQL数据库char与varchar的区别分析及使用建议
在数据库中,字符 型的数据是最多的,可以占到整个数据库的80%以上.为此正确处理字符型的数据,对于提高数据库的性能有很大的作用.在字符型数据中,用的最多的就是 Char与Varchar两种类型.前面的 ...
最新文章
- access open 知乎_NX使用——远程IDE利器
- leetcode算法题--扁平化多级双向链表★
- android 让item满屏,Android的全屏活动?
- 【亚马逊AWS】入门级别实践
- 自用零散博文-route_state.ts
- 一个较好的基础的数据库连接池知识
- dx绘制2d图像_【3D建模】聊聊2D动画软件
- C++:显示每年的各月份第一天是星期几
- python更换证件照底色
- Excel通过图片名插入图片
- 看完书就忘,怎么办?告诉你六种方法(转载)
- BIRD 与 BGP 的新手开场 --转
- 大数据应用技术实验报告五 NoSQL
- CeSharp107.1.4升级物联网浏览器
- 解决ijkplayer和阿里云播放器冲突的解决
- CSS颜色代码大全及a标签超链接颜色改变
- 光华股份深交所上市:市值51亿 应收账款余额超5亿
- 记录2015年年初跳槽的经历!
- 盘一盘!实时自动驾驶车辆定位技术都有哪些?(视觉/Lidar/多传感器数据融合)...
- “远程办公”用户达3.46亿,一年每人可节省1.4万
热门文章
- linux类似360软件,linux下有什么类似鲁大师查看电脑配置的软
- cx_oracle写日志信息_看日志痛苦——可能是你方法不对
- python去除图像光照不均匀_CVPR 2020 | 从重建质量到感知质量:用于低光照增强的半监督学习方法...
- 光端机与光电转换器的区别介绍
- 工业交换机和工业4G路由器的区分
- [渝粤教育] 西南科技大学 西方经济学 在线考试复习资料
- 国家开放大学2021春1080工程数学(本)题目
- 【渝粤教育】广东开放大学 动画原画设计 形成性考核 (22)
- LoRaWAN 巩固了其作为低功耗广域网主导技术的地位
- 表示微型计算机系统稳定性,计算机基础知识(三)135