一、Class的getResource(String path):URL

1、path 不以’/'开头时,默认是从此类所在的包下取资源;
2、path 以’/'开头时,则是从ClassPath根下获取;
System.out.println(Test.class.getResource(""));
System.out.println(Test.class.getResource("/"));
file:/E:/java/Test/bin/cn/
file:/E:/java/Test/bin/

二、类加载器ClassLoader的getResource(String path)

1、path 不以'/'开头

path是指类加载器的加载范围,在资源加载的过程中,使用的逐级向上委托的形式加载的,加载范围是从整个ClassPath范围。

2、path 以'/'开头

'/'表示Boot ClassLoader中的加载范围,因为这个类加载器是C++实现的,所以加载范围为null。

System.out.println(Test.class.getClassLoader().getResource(""));
System.out.println(Test.class.getClassLoader().getResource("/"));

file:/E:/java/Test/bin/
  null

三、class.getResource("/") 等价于 class.getClassLoader().getResource("")

class.getResource()与classLoader().getResource()最终使用了系统类加载器加载以classpath为根的不带'/'的路径进行加载资源

Class的getResource方法源码

public URL getResource(String name){name = resolveName(name);//将路径转换成为classpath根的绝对路径,不以/开头ClassLoader cl = getClassLoader0();if (cl==null){// A system class.return ClassLoader.getSystemResource(name);}return cl.getResource(name);
}

getClassLoader0方法与resolveName方法

//获取当前类的类加载器
ClassLoader getClassLoader0(){return classLoader;
}//获取classpath根的绝对路径,不以/开头
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;
}

View Code

ClassLoader.getSystemResource方法

public static URL getSystemResource(String name) {//返回委派的系统类加载器。这是默认代表团的父母新的类加载器实例,并通常用于启动应用程序的类加载器。ClassLoader system = getSystemClassLoader();if (system == null) {return getBootstrapResource(name);//根据根加载器的路径检索资源
    }return system.getResource(name);
}
// The class loader for the system
private static ClassLoader scl;
public static ClassLoader getSystemClassLoader() {initSystemClassLoader();if (scl == null) {return null;}SecurityManager sm = System.getSecurityManager();if (sm != null) {checkClassLoaderPermission(scl, Reflection.getCallerClass());}return scl;
}

View Code

ClassLoader.getResource方法源码

private final ClassLoader parent;
public URL getResource(String name) {URL url;//父加载器非nullif (parent != null) {url = parent.getResource(name);  //请求父加载器获取资源} else {url = getBootstrapResource(name); //该类为ExtClassLoader,用其父加载器Bootstrap加载资源
        }if (url == null) {url = findResource(name);}return url;
}
//从虚拟机的内置类加载器查找资源
private static URL getBootstrapResource(String name) {URLClassPath ucp = getBootstrapClassPath();Resource res = ucp.getResource(name); return res != null ? res.getURL() : null;
}//返回urlclasspath是用于发现系统资源。
static URLClassPath getBootstrapClassPath() {return sun.misc.Launcher.getBootstrapClassPath();
}

Class的getResource与ClassLoader的getResource路径/问题相关推荐

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

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

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

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

  3. Class.getResource和ClassLoader.getResource

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

  4. Class.getResource和ClassLoader.getResource的区别分析

    原文:http://swiftlet.net/archives/868 在Java中获取资源的时候,经常用到Class.getResource和ClassLoader.getResource,本文给大 ...

  5. Class.getResource()与Class.getClassLoader().getResource()解析

    我们在eclipse上写的.java文件最终会被编译成一个.class的字节码文件.而java源文件存储在src文件下,而编译后的.class字节码文件存储在bin文件下. 一. 通过Class.ge ...

  6. 使用Fastdfs上传文件时出现中文乱码。工具类中的this.getClass().getResource(“/“).getPath()获取配置文件的路径时中文乱码。

    报错: Exception in thread "main" org.csource.common.MyException: item "tracker_server&q ...

  7. Java文件路径(getResource)

    getResourceAsStream ()返回的是inputstream getResource()返回:URL Class.getResource("")    返回的是当前C ...

  8. getResource()的几种路径方式

    1. 前言 在Java中获取资源的时候,经常用到getResource和getResourceAsStream,本文总结一下这两种获取资源文件的路径差异. 2.Class.getResource(St ...

  9. linux读取class下的文件路径,Class类getResource方法获取文件路径

    在应用程序中,经常有需求获取资源文件的路径,并加载之. 其中一个方法就是使用绝对路径,比如: File file = new File("D://xxxx"); 但是不支持跨系统, ...

最新文章

  1. 爬虫笔记(一)——快速使用urllib库
  2. 云服务器 ECS 建站教程:创建基于ECS和RDS的WordPress环境
  3. 安装elasticsearch5.4.1集群和head插件
  4. OPENCV-4 学习笔记
  5. Vim引申以及Linux下彩色进度条实现
  6. 数据库——Oracle(1)
  7. Spring AOP 性能监控器
  8. ARM购HPC软件专家Allinea叫板英特尔和IBM
  9. MTK modemlog分析
  10. pcie转sata3硬盘不启动_XPS 笔记本: 排除对 BIOS 默认设置的更改导致无法开机自检/无引导/硬盘或未检测到 SDD 问题...
  11. 如何删除2345浏览器网络导航主页
  12. CodeForces 140C New Year Snowm
  13. MIPS,程序的CPI,时钟周期计算(主频的计算)
  14. 【第一章】google guava 之 Joiner学习
  15. Chrome 浏览器调试的日常使用总结
  16. 解决程序中出现小方块问题
  17. TcpClient 示例程序 C 语言
  18. 模电课程设计——三级电路1
  19. 【渝粤题库】陕西师范大学180104市场调查与预测Ⅰ作业(高起专)
  20. EMLOG全站ajax的主题模板 Faded最终k源版本

热门文章

  1. [C++11]字符串原始字面量
  2. 蓝桥杯2015初赛-方程整数解-枚举
  3. windows系统如何cmake_Windows操作系统如何快速增加分区?建议收藏
  4. 网络编程——常用协议解析
  5. AtCoder Regular Contest 064
  6. Codeforces Round #630 (Div. 2) E. Height All the Same 排列组合
  7. Educational Codeforces Round 84 (Rated for Div. 2) D. Infinite Path 构建环 + 思维
  8. Codeforces Round #737 (Div. 2)
  9. 牛客网【每日一题】3月27日 数学考试
  10. Codeforces Round #764 (Div. 3)