简单的getClass().getResource()与ClassLoader.getResource()区别
1.简介
我们在springboot项目中,如果要获取到自己配置的资源或者配置类信息一般会用到Class.getResource()或ClassLoader.getResource(),这两种方式在使用的过程中很容易混淆,此处进行简单测试记录一下使用过程中的区别
本次测试项目结构图如下:
2.测试代码
package cn.git.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @description: class.getResource与classLoader.getResource获取资源路径信息测试
* @program: bank-credit-sy
* @author: lixuchun
* @create: 2024-08-13
*/
@RestController
@RequestMapping("/resource")
public class ResourceTestController {
/**
* 通过class获取资源路径信息
* getResource("") 获取的是当前类所在包的路径,而 getResource("/") 获取的是 classpath 根路径
*/
@GetMapping("/class")
public void test() {
// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/controller/
System.out.println(this.getClass().getResource(""));
// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/
System.out.println(this.getClass().getResource("/"));
}
/**
* 获取文件信息
* 需要注意的是 => .java编译后编程.class,所以这里参数传的文件名是.class结尾
* 当以 "/" 开头时,是从 classpath 路径开始匹配资源
* 当不以 "/" 开头时,是从当前类所在包的路径开始匹配资源
* 两种方式都可以通过 "/" 或 "../" 在文件夹上下层路径切换
*
* 另外,在获取文件时,我们还可以通过 getResourceAsStream 直接获取文件输入流
* InputStream inputStream = this.getClass().getResourceAsStream("/config.properties");
* 且 getResourceAsStream() 和 getResource() 在获取文件流和文件路径时,路径选择机制是一样的。
*/
@GetMapping("/properties")
public void properties() {
// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/application.yml
System.out.println(this.getClass().getResource("/application.yml"));
// null
System.out.println(this.getClass().getResource("custom.dict"));
// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/dict/custom.dict
System.out.println(this.getClass().getResource("/dict/custom.dict"));
// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/controller/ResourceTestController.class
System.out.println(this.getClass().getResource("ResourceTestController.class"));
// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/cn/git/helloApplication.class
System.out.println(this.getClass().getResource("../helloApplication.class"));
// null
System.out.println(this.getClass().getResource("../classpath/helloApplication.class"));
}
/**
* 在使用 ClassLoader().getResource 获取路径时,不能以 "/" 开头,且路径总是从 classpath 根路径开始
*/
@GetMapping("/classLoader")
public void classLoader() {
// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/
System.out.println(this.getClass().getClassLoader().getResource(""));
// null
System.out.println(this.getClass().getClassLoader().getResource("/"));
}
/**
* ClassLoader().getResource 只能从 classpath 开始获取资源,同样也能使用getResourceAsStream()获取文件输入流,且路径机制一样
* 同Class.getResourceAsStream()一样,我们还可以通过ClassLoader.getResourceAsStream()直接获取文件输入流
* ClassLoader.getResourceAsStream() 和 ClassLoader.getResource()在获取文件流和文件路径时,路径选择机制也是一样的
*/
@GetMapping("/classLoader/properties")
public void classLoaderProperties() {
// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/application.yml
System.out.println(this.getClass().getClassLoader().getResource("application.yml"));
// null
System.out.println(this.getClass().getClassLoader().getResource("custom.dict"));
// file:/D:/idea_workspace_activiti_change/docker-hello/target/classes/dict/custom.dict
System.out.println(this.getClass().getClassLoader().getResource("dict/custom.dict"));
}
}
3.结论
Class.getResource()
可以从当前Class
所在包的路径开始匹配获取资源,也可以从classpath
根路径开始匹配获取资源ClassLoader().getResource()
只能从classpath
根路径开始匹配获取资源Class.getResource()
从当前包所在路径获取资源时不能以/
开头,而从classpath
根路径获取资源时必须以/
开头ClassLoader().getResource()
不能以/
开头,且路径总是从classpath
根路径开始- 它们都能通过
getResourceAsStream()
方法获取对应路径文件的输入流,文件路径匹配机制和其getResource()
方法一样
本文转载此篇知乎文章,进行部分简单修改方便自己记录以及后续学习使用