Class的getResource与ClassLoader的getResource路径/问题
一、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路径/问题相关推荐
- 关于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
一案例驱动 二源码分析 三类加载器ClassLoader 四总结 五参考 一案例驱动 最近加载文件的时候遇到了一个问题,很有意思! 具体看下面案例代码 public class TestClassLo ...
- Class.getResource和ClassLoader.getResource的区别分析
原文:http://swiftlet.net/archives/868 在Java中获取资源的时候,经常用到Class.getResource和ClassLoader.getResource,本文给大 ...
- Class.getResource()与Class.getClassLoader().getResource()解析
我们在eclipse上写的.java文件最终会被编译成一个.class的字节码文件.而java源文件存储在src文件下,而编译后的.class字节码文件存储在bin文件下. 一. 通过Class.ge ...
- 使用Fastdfs上传文件时出现中文乱码。工具类中的this.getClass().getResource(“/“).getPath()获取配置文件的路径时中文乱码。
报错: Exception in thread "main" org.csource.common.MyException: item "tracker_server&q ...
- Java文件路径(getResource)
getResourceAsStream ()返回的是inputstream getResource()返回:URL Class.getResource("") 返回的是当前C ...
- getResource()的几种路径方式
1. 前言 在Java中获取资源的时候,经常用到getResource和getResourceAsStream,本文总结一下这两种获取资源文件的路径差异. 2.Class.getResource(St ...
- linux读取class下的文件路径,Class类getResource方法获取文件路径
在应用程序中,经常有需求获取资源文件的路径,并加载之. 其中一个方法就是使用绝对路径,比如: File file = new File("D://xxxx"); 但是不支持跨系统, ...
最新文章
- 爬虫笔记(一)——快速使用urllib库
- 云服务器 ECS 建站教程:创建基于ECS和RDS的WordPress环境
- 安装elasticsearch5.4.1集群和head插件
- OPENCV-4 学习笔记
- Vim引申以及Linux下彩色进度条实现
- 数据库——Oracle(1)
- Spring AOP 性能监控器
- ARM购HPC软件专家Allinea叫板英特尔和IBM
- MTK modemlog分析
- pcie转sata3硬盘不启动_XPS 笔记本: 排除对 BIOS 默认设置的更改导致无法开机自检/无引导/硬盘或未检测到 SDD 问题...
- 如何删除2345浏览器网络导航主页
- CodeForces 140C New Year Snowm
- MIPS,程序的CPI,时钟周期计算(主频的计算)
- 【第一章】google guava 之 Joiner学习
- Chrome 浏览器调试的日常使用总结
- 解决程序中出现小方块问题
- TcpClient 示例程序 C 语言
- 模电课程设计——三级电路1
- 【渝粤题库】陕西师范大学180104市场调查与预测Ⅰ作业(高起专)
- EMLOG全站ajax的主题模板 Faded最终k源版本
热门文章
- [C++11]字符串原始字面量
- 蓝桥杯2015初赛-方程整数解-枚举
- windows系统如何cmake_Windows操作系统如何快速增加分区?建议收藏
- 网络编程——常用协议解析
- AtCoder Regular Contest 064
- Codeforces Round #630 (Div. 2) E. Height All the Same 排列组合
- Educational Codeforces Round 84 (Rated for Div. 2) D. Infinite Path 构建环 + 思维
- Codeforces Round #737 (Div. 2)
- 牛客网【每日一题】3月27日 数学考试
- Codeforces Round #764 (Div. 3)